Distribution of Final Exam Scores
Distribution of Final Exam Scores(Without Considering Other
Factors)
Here we will explore the distribution of final exam scores among
students with without considering other factors. To find our the
distribution of final exam scores, we first need to sample the data and
plot a histogram.
# Sample the data
set.seed(123)
exam_score_sample <- student_data$Exam_Score[sample(nrow(student_data), 100)]
exam_score_sample
[1] 68 66 74 63 71 67 62 74 67 63 64 72 59 63 63 69 68 63 71 70 66 61 68 71 64
[26] 64 69 73 70 65 72 65 64 70 69 69 62 68 68 71 69 73 73 66 65 65 69 67 68 69
[51] 67 65 66 61 66 68 70 66 67 68 70 72 75 67 65 69 72 68 66 66 67 64 65 72 67
[76] 71 69 59 69 69 66 68 63 67 62 63 72 65 65 63 58 67 65 69 71 66 67 65 61 71
# Plot histogram
hist(exam_score_sample, main = "Distribution of Final Exam Scores", xlab = "Final Exam Score", col = "skyblue", border = "black")

From the histogram, we can see that the distribution of final exam
scores is approximately normal. We now plot a boxplot to visualize the
spread of scores and identify any outliers.
# Boxplot of final exam scores
boxplot(exam_score_sample, main = "Boxplot of Final Exam Scores", col = "skyblue", border = "black")

The boxplot shows that the distribution of final exam scores is
centered around the median, with a few outliers on the lower end of the
scale. Now we use numerical methods to confirm the normality of the
distribution.
# Shapiro-Wilk test for normality
shapiro.test(exam_score_sample)
Shapiro-Wilk normality test
data: exam_score_sample
W = 0.98776, p-value = 0.4903
The Shapiro-Wilk test confirms that the distribution of final exam
scores is approximately normal, with a p-value greater than 0.05.
Distribution of Final Exam Scores (Parental_Involvement
Category)
Next, we explore the distribution of final exam scores based on
parental involvement levels. We will create a boxplot to compare the
scores of students with different levels of parental involvement.
# Sample the data
high_parental_involvement <- student_data$Exam_Score[student_data$Parental_Involvement == "High"][sample(sum(student_data$Parental_Involvement == "High"), 100)]
medium_parental_involvement <- student_data$Exam_Score[student_data$Parental_Involvement == "Medium"][sample(sum(student_data$Parental_Involvement == "Medium"), 100)]
low_parental_involvement <- student_data$Exam_Score[student_data$Parental_Involvement == "Low"][sample(sum(student_data$Parental_Involvement == "Low"), 100)]
# Histogram of final exam scores by parental involvement
par(mfrow = c(1, 3))
hist(high_parental_involvement, main = "High Parental Involvement", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(medium_parental_involvement, main = "Medium Parental Involvement", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(low_parental_involvement, main = "Low Parental Involvement", xlab = "Final Exam Score", col = "skyblue", border = "black")

The three histograms show the distribution of final exam scores for
students with high, medium, and low levels of parental involvement. We
can see that the distribution of the scores seems to be similar across
all three categories. They seem to follow a normal distribution, with a
slight skew towards higher scores for students with high parental
involvement. We now use numerical methods to confirm the normality of
the distributions.
# Shapiro-Wilk test for normality
shapiro.test(high_parental_involvement)
Shapiro-Wilk normality test
data: high_parental_involvement
W = 0.9794, p-value = 0.1194
shapiro.test(medium_parental_involvement)
Shapiro-Wilk normality test
data: medium_parental_involvement
W = 0.98125, p-value = 0.1662
shapiro.test(low_parental_involvement)
Shapiro-Wilk normality test
data: low_parental_involvement
W = 0.96994, p-value = 0.02186
The Shapiro-Wilk test confirms that the distributions of final exam
scores for students with high and medium levels of parental involvement
are approximately normal, with p-values greater than 0.05. However, the
distribution for students with low parental involvement is slightly
skewed, with a p-value less than 0.05.
We now investigate the distribution of final exam scores for students
with low parental involvement further. We will now plot a density plot
to visualize the distribution more clearly.
# Density plot of final exam scores for students with low parental involvement
plot(density(low_parental_involvement), main = "Density Plot of Final Exam Scores for Low Parental Involvement", xlab = "Final Exam Score", col = "skyblue")

The density plot shows that the distribution of final exam is
slightly skewed to the left for students with low parental involvement.
We will now create a QQ plot to compare the distribution of scores to a
normal distribution.
# QQ plot of final exam scores for students with low parental involvement
qqnorm(low_parental_involvement, main = "QQ Plot of Final Exam Scores for Low Parental Involvement", col = "skyblue")
qqline(low_parental_involvement, col = "red")

The QQ plot confirms that the distribution of final exam scores for
students with low parental involvement is slightly skewed to the left,
deviating from a normal distribution.
Distribution of Final Exam Scores (Access_to_Resources
Category)
Next, we explore the distribution of final exam scores based on
access to resources. We will create a boxplot to compare the scores of
students with different levels of access to resources.
# Sample the data
high_access_to_resources <- student_data$Exam_Score[student_data$Access_to_Resources == "High"][sample(sum(student_data$Access_to_Resources == "High"), 100)]
medium_access_to_resources <- student_data$Exam_Score[student_data$Access_to_Resources == "Medium"][sample(sum(student_data$Access_to_Resources == "Medium"), 100)]
low_access_to_resources <- student_data$Exam_Score[student_data$Access_to_Resources == "Low"][sample(sum(student_data$Access_to_Resources == "Low"), 100)]
# Histogram of final exam scores by access to resources
par(mfrow = c(1, 3))
hist(high_access_to_resources, main = "High Access to Resources", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(medium_access_to_resources, main = "Medium Access to Resources", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(low_access_to_resources, main = "Low Access to Resources", xlab = "Final Exam Score", col = "skyblue", border = "black")

plot(density(low_access_to_resources), main = "Low Access to Resources", xlab = "Final Exam Score", col = "skyblue")
plot(density(medium_access_to_resources), main = "Medium Access to Resources", xlab = "Final Exam Score", col = "skyblue")
plot(density(high_access_to_resources), main = "High Access to Resources", xlab = "Final Exam Score", col = "skyblue")

The histograms and density plots show the distribution of final exam
scores for students with high, medium, and low levels of access to
resources. The distributions seem to be similar across all three
categories, with a slight skew towards higher scores for students with
high access to resources. We will now use numerical methods to confirm
the normality of the distributions.
# Shapiro-Wilk test for normality
shapiro.test(high_access_to_resources)
Shapiro-Wilk normality test
data: high_access_to_resources
W = 0.85758, p-value = 2.283e-08
shapiro.test(medium_access_to_resources)
Shapiro-Wilk normality test
data: medium_access_to_resources
W = 0.73995, p-value = 5.121e-12
shapiro.test(low_access_to_resources)
Shapiro-Wilk normality test
data: low_access_to_resources
W = 0.77633, p-value = 4.942e-11
The Shapiro-Wilk test shows that the distribution of all three
categories of access to resources is not normal, with p-values less than
0.05. This indicates that the distribution of final exam scores is
skewed for students with different levels of access to resources.
Distribution of Final Exam Scores (Motivation_Level Category)
Next we explore the distribution of final exam scores based on
motivation levels. We will create a histogram to compare the scores of
students with different motivation levels.
# Smaple Data
high_motivation <- student_data$Exam_Score[student_data$Motivation_Level == "High"][sample(sum(student_data$Motivation_Level == "High"), 100)]
medium_motivation <- student_data$Exam_Score[student_data$Motivation_Level == "High"][sample(sum(student_data$Motivation_Level == "Medium"), 100)]
low_motivation <- student_data$Exam_Score[student_data$Motivation_Level == "High"][sample(sum(student_data$Motivation_Level == "Low"), 100)]
# Histogram of final exam scores by motivation level
par(mfrow = c(1, 3))
hist(high_motivation, main = "High Motivation Level", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(medium_motivation, main = "Medium Motivation Level", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(low_motivation, main = "Low Motivation Level", xlab = "Final Exam Score", col = "skyblue", border = "black")

The histograms for High and medium motivation levels show a normal
distribution of final exam scores, while the low motivation level
histogram shows a right-skewed distribution. We will now use numerical
methods to confirm the normality of the distributions.
# Shapiro-Wilk test for normality
shapiro.test(high_motivation)
Shapiro-Wilk normality test
data: high_motivation
W = 0.98236, p-value = 0.202
shapiro.test(medium_motivation)
Shapiro-Wilk normality test
data: medium_motivation
W = 0.9695, p-value = 0.4479
shapiro.test(low_motivation)
Shapiro-Wilk normality test
data: low_motivation
W = 0.73846, p-value = 2.385e-09
The Shapiro-Wilk test confirms that the distributions of final exam
scores for students with high and medium motivation levels are
approximately normal, with p-values greater than 0.05. However, the
distribution for students with low motivation levels is slightly skewed,
with a p-value less than 0.05.
Distribution of Final Exam Scores (Internet_Access Category)
Next, we explore the distribution of final exam scores based on
internet access. We will create a boxplot to compare the scores of
students with and without internet access.
# Sample the data
internet_access <- student_data$Exam_Score[student_data$Internet_Access == "Yes"][sample(sum(student_data$Internet_Access == "Yes"), 100)]
no_internet_access <- student_data$Exam_Score[student_data$Internet_Access == "No"][sample(sum(student_data$Internet_Access == "No"), 100)]
# Boxplot of final exam scores by internet access
boxplot(student_data$Exam_Score ~ student_data$Internet_Access, main = "Final Exam Scores by Internet Access", xlab = "Internet Access", ylab = "Final Exam Score", col = "skyblue", border = "black")

# Histogram of final exam scores by internet access
par(mfrow = c(1, 2))
hist(internet_access, main = "Internet Access", xlab = "Final Exam Score", col = "skyblue", border = "black")
hist(no_internet_access, main = "No Internet Access", xlab = "Final Exam Score", col = "skyblue", border = "black")

# Shapiro-Wilk test for normality
shapiro.test(internet_access)
Shapiro-Wilk normality test
data: internet_access
W = 0.8257, p-value = 1.654e-09
shapiro.test(no_internet_access)
Shapiro-Wilk normality test
data: no_internet_access
W = 0.98411, p-value = 0.2736
The boxplot shows that students with internet access tend to have
higher final exam scores compared to those without internet access. The
histograms show that the distribution of final exam scores for students
with no internet access is approximately normal, while the distribution
for students with internet access is slightly skewed. The Shapiro-Wilk
test confirms that the distribution of final exam scores for students
without internet access is normal, with a p-value greater than 0.05.
However, the distribution for students with internet access is slightly
skewed, with a p-value less than 0.05.
Summary of Distribution Analysis
In summary, the distribution of final exam scores is approximately
normal when considering all students. However, when examining the scores
based on other factors such as parental involvement, access to
resources, extracurricular activities, and motivation levels, the
distributions vary. Students with high parental involvement and high
access to resources tend to have higher final exam scores, while
students who participate in extracurricular activities also perform
better. Motivation levels also play a role in student performance, with
students who are highly motivated achieving higher scores.
Average number of hours students study per week
Average Number of Hours Students Study per Week (Without Considering
Other Factors)
Next, we explore the average number of hours students study per week
without considering other factors.
# Summary statistics for study hours
summary(student_data$Hours_Studied)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.98 24.00 44.00
The summary statistics show that the average number of hours students
study per week is approximately 19.98 hours. We will now visualize the
distribution of study hours using a histogram.
# Histogram of study hours
hist(student_data$Hours_Studied, main = "Distribution of Study Hours", xlab = "Study Hours", col = "skyblue", border = "black")

The distribution of study hours is approximately normal. We will now
use numerical methods to confirm the normality of the distribution.
# Shapiro-Wilk test for normality
sample_hours_studied <- student_data$Hours_Studied[sample(nrow(student_data), 100)]
shapiro.test(sample_hours_studied)
Shapiro-Wilk normality test
data: sample_hours_studied
W = 0.97756, p-value = 0.08568
The p-value is greater than 0.05, indicating that the distribution of
study hours is approximately normal.
Average Number of Hours Students Study per Week
(Parental_Involvement Category)
Next, we will explore the average number of hours students study per
week based on parental involvement levels.
# Summary statistics for study hours by parental involvement
summary(student_data$Hours_Studied[student_data$Parental_Involvement == "High"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.85 24.00 44.00
summary(student_data$Hours_Studied[student_data$Parental_Involvement == "Medium"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.98 24.00 39.00
summary(student_data$Hours_Studied[student_data$Parental_Involvement == "Low"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 20.13 24.00 38.00
The summary statistics of the average number of hours students study
per week based on parental involvement levels do not show significant
differences. We will now use ANOVA to test for differences in study
hours based on parental involvement levels. But first, we need to check
the assumptions of ANOVA.
# Sample the data
high_parental_involvement <- student_data$Hours_Studied[student_data$Parental_Involvement == "High"][sample(sum(student_data$Parental_Involvement == "High"), 100)]
medium_parental_involvement <- student_data$Hours_Studied[student_data$Parental_Involvement == "Medium"][sample(sum(student_data$Parental_Involvement == "Medium"), 100)]
low_parental_involvement <- student_data$Hours_Studied[student_data$Parental_Involvement == "Low"][sample(sum(student_data$Parental_Involvement == "Low"), 100)]
# Histogram of study hours by parental involvement
par(mfrow = c(1, 3))
hist(high_parental_involvement, main = "High Parental Involvement", xlab = "Study Hours", col = "skyblue", border = "black")
hist(medium_parental_involvement, main = "Medium Parental Involvement", xlab = "Study Hours", col = "skyblue", border = "black")
hist(low_parental_involvement, main = "Low Parental Involvement", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(high_parental_involvement)
Shapiro-Wilk normality test
data: high_parental_involvement
W = 0.97236, p-value = 0.03359
shapiro.test(medium_parental_involvement)
Shapiro-Wilk normality test
data: medium_parental_involvement
W = 0.98679, p-value = 0.4239
shapiro.test(low_parental_involvement)
Shapiro-Wilk normality test
data: low_parental_involvement
W = 0.9848, p-value = 0.3072
Both the histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
parental involvement levels.
# ANOVA test for study hours by parental involvement
anova_parental_involvement <- aov(Hours_Studied ~ Parental_Involvement, data = student_data)
summary(anova_parental_involvement)
Df Sum Sq Mean Sq F value Pr(>F)
Parental_Involvement 2 62 30.86 0.86 0.423
Residuals 6604 237009 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on parental
involvement levels, with a p-value greater than 0.05. This indicates
that parental involvement does not have a significant impact on the
number of hours students study per week.
Average Number of Hours Students Study per Week (Access_to_Resources
Category)
We now explore the average number of hours students study per week
based on access to resources.
summary(student_data$Hours_Studied[student_data$Access_to_Resources == "High"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 16 20 20 24 39
summary(student_data$Hours_Studied[student_data$Access_to_Resources == "Medium"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.91 24.00 43.00
summary(student_data$Hours_Studied[student_data$Access_to_Resources == "Low"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 20.12 24.00 44.00
The summary statistics of the average number of hours students study
per week based on access to resources do not show significant
differences. We will now use ANOVA to test for differences in study
hours based on access to resources. But first, we need to check the
assumptions of ANOVA.
# Sample the data
high_access_to_resources <- student_data$Hours_Studied[student_data$Access_to_Resources == "High"][sample(sum(student_data$Access_to_Resources == "High"), 100)]
medium_access_to_resources <- student_data$Hours_Studied[student_data$Access_to_Resources == "Medium"][sample(sum(student_data$Access_to_Resources == "Medium"), 100)]
low_access_to_resources <- student_data$Hours_Studied[student_data$Access_to_Resources == "Low"][sample(sum(student_data$Access_to_Resources == "Low"), 100)]
# Histogram of study hours by access to resources
par(mfrow = c(1, 3))
hist(high_access_to_resources, main = "High Access to Resources", xlab = "Study Hours", col = "skyblue", border = "black")
hist(medium_access_to_resources, main = "Medium Access to Resources", xlab = "Study Hours", col = "skyblue", border = "black")
hist(low_access_to_resources, main = "Low Access to Resources", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(high_access_to_resources)
Shapiro-Wilk normality test
data: high_access_to_resources
W = 0.9943, p-value = 0.9529
shapiro.test(medium_access_to_resources)
Shapiro-Wilk normality test
data: medium_access_to_resources
W = 0.99005, p-value = 0.6688
shapiro.test(low_access_to_resources)
Shapiro-Wilk normality test
data: low_access_to_resources
W = 0.98149, p-value = 0.1735
Both the histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
access to resources.
# ANOVA test for study hours by access to resources
anova_access_to_resources <- aov(Hours_Studied ~ Access_to_Resources, data = student_data)
summary(anova_access_to_resources)
Df Sum Sq Mean Sq F value Pr(>F)
Access_to_Resources 2 45 22.49 0.627 0.534
Residuals 6604 237026 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on access to
resources, with a p-value greater than 0.05. This indicates that access
to resources does not have a significant impact on the number of hours
students study per week.
Average Number of Hours Students Study per Week (Motivation_Level
Category)
Next, we explore the average number of hours students study per week
based on motivation levels.
# Summary statistics for study hours by motivation level
summary(student_data$Hours_Studied[student_data$Motivation_Level == "High"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.73 24.00 39.00
summary(student_data$Hours_Studied[student_data$Motivation_Level == "Medium"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 20.08 24.00 43.00
summary(student_data$Hours_Studied[student_data$Motivation_Level == "Low"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 19.96 24.00 44.00
The summary statistics of the average number of hours students study
per week based on motivation levels show no significant differences. We
will now use ANOVA to test for differences in study hours based on
motivation levels. But first, we need to check the assumptions of
ANOVA.
# Sample the data
high_motivation <- student_data$Hours_Studied[student_data$Motivation_Level == "High"][sample(sum(student_data$Motivation_Level == "High"), 100)]
medium_motivation <- student_data$Hours_Studied[student_data$Motivation_Level == "Medium"][sample(sum(student_data$Motivation_Level == "Medium"), 100)]
low_motivation <- student_data$Hours_Studied[student_data$Motivation_Level == "Low"][sample(sum(student_data$Motivation_Level == "Low"), 100)]
# Histogram of study hours by motivation level
par(mfrow = c(1, 3))
hist(high_motivation, main = "High Motivation Level", xlab = "Study Hours", col = "skyblue", border = "black")
hist(medium_motivation, main = "Medium Motivation Level", xlab = "Study Hours", col = "skyblue", border = "black")
hist(low_motivation, main = "Low Motivation Level", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(high_motivation)
Shapiro-Wilk normality test
data: high_motivation
W = 0.98203, p-value = 0.1909
shapiro.test(medium_motivation)
Shapiro-Wilk normality test
data: medium_motivation
W = 0.99185, p-value = 0.8103
shapiro.test(low_motivation)
Shapiro-Wilk normality test
data: low_motivation
W = 0.9841, p-value = 0.2729
All three histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
motivation levels.
# ANOVA test for study hours by motivation level
anova_motivation_level <- aov(Hours_Studied ~ Motivation_Level, data = student_data)
summary(anova_motivation_level)
Df Sum Sq Mean Sq F value Pr(>F)
Motivation_Level 2 119 59.43 1.656 0.191
Residuals 6604 236952 35.88
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on motivation
levels, with a p-value greater than 0.05. This indicates that motivation
levels do not have a significant impact on the number of hours students
study per week.
Average Number of Hours Students Study per Week (Internet Access
Category)
Next, we explore the average number of hours students study per week
based on internet access.
# Summary statistics for study hours by internet access
summary(student_data$Hours_Studied[student_data$Internet_Access == "Yes"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.98 24.00 44.00
summary(student_data$Hours_Studied[student_data$Internet_Access == "No"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.00 16.00 20.00 19.87 24.00 39.00
The summary statistics of the average number of hours students study
per week based on internet access show no significant differences. We
will now use ANOVA to test for differences in study hours based on
internet access. But first, we need to check the assumptions of
ANOVA.
# Sample the data
internet_access <- student_data$Hours_Studied[student_data$Internet_Access == "Yes"][sample(sum(student_data$Internet_Access == "Yes"), 100)]
no_internet_access <- student_data$Hours_Studied[student_data$Internet_Access == "No"][sample(sum(student_data$Internet_Access == "No"), 100)]
# Histogram of study hours by internet access
par(mfrow = c(1, 2))
hist(internet_access, main = "Internet Access", xlab = "Study Hours", col = "skyblue", border = "black")
hist(no_internet_access, main = "No Internet Access", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(internet_access)
Shapiro-Wilk normality test
data: internet_access
W = 0.98233, p-value = 0.2012
shapiro.test(no_internet_access)
Shapiro-Wilk normality test
data: no_internet_access
W = 0.99069, p-value = 0.7201
Both the histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
internet access.
# ANOVA test for study hours by internet access
anova_internet_access <- aov(Hours_Studied ~ Internet_Access, data = student_data)
summary(anova_internet_access)
Df Sum Sq Mean Sq F value Pr(>F)
Internet_Access 1 6 6.02 0.168 0.682
Residuals 6605 237065 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on internet
access, with a p-value greater than 0.05. This indicates that internet
access does not have a significant impact on the number of hours
students study per week.
Average Number of Hours Students Study per Week (Family Income
Category)
Next, we explore the average number of hours students study per week
based on family income levels.
# Summary statistics for study hours by family income
summary(student_data$Hours_Studied[student_data$Family_Income == "Low"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.93 24.00 39.00
summary(student_data$Hours_Studied[student_data$Family_Income == "Medium"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 20.05 24.00 44.00
summary(student_data$Hours_Studied[student_data$Family_Income == "High"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 16.0 20.0 19.9 24.0 39.0
The summary statistics of the average number of hours students study
per week based on family income levels show no significant differences.
We will now use ANOVA to test for differences in study hours based on
family income levels. But first, we need to check the assumptions of
ANOVA.
# Sample the data
low_family_income <- student_data$Hours_Studied[student_data$Family_Income == "Low"][sample(sum(student_data$Family_Income == "Low"), 100)]
medium_family_income <- student_data$Hours_Studied[student_data$Family_Income == "Medium"][sample(sum(student_data$Family_Income == "Medium"), 100)]
high_family_income <- student_data$Hours_Studied[student_data$Family_Income == "High"][sample(sum(student_data$Family_Income == "High"), 100)]
# Histogram of study hours by family income
par(mfrow = c(1, 3))
hist(low_family_income, main = "Low Family Income", xlab = "Study Hours", col = "skyblue", border = "black")
hist(medium_family_income, main = "Medium Family Income", xlab = "Study Hours", col = "skyblue", border = "black")
hist(high_family_income, main = "High Family Income", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(low_family_income)
Shapiro-Wilk normality test
data: low_family_income
W = 0.97249, p-value = 0.0344
shapiro.test(medium_family_income)
Shapiro-Wilk normality test
data: medium_family_income
W = 0.97664, p-value = 0.07252
shapiro.test(high_family_income)
Shapiro-Wilk normality test
data: high_family_income
W = 0.9796, p-value = 0.1237
The Shapiro-Wilk test shows that the distribution of study hours is
approximately normal for students with medium and high family income
levels, with p-values greater than 0.05. However, the distribution for
students with low family income is slightly skewed, with a p-value less
than 0.05 indicating that the distribution is not normal. We will now
use Kruksal-Wallis test to test for differences in study hours based on
family income levels.
# Kruskal-Wallis test for study hours by family income
kruskal.test(Hours_Studied ~ Family_Income, data = student_data)
Kruskal-Wallis rank sum test
data: Hours_Studied by Family_Income
Kruskal-Wallis chi-squared = 0.72144, df = 2, p-value = 0.6972
The Kruskal-Wallis test shows that there is no significant difference
in the average number of hours students study per week based on family
income levels, with a p-value greater than 0.05. This indicates that
family income does not have a significant impact on the number of hours
students study per week.
Average Number of Hours Students Study per Week (Teacher Quality
Category)
Next, we explore the average number of hours students study per week
based on teacher quality levels.
# Summary statistics for study hours by teacher quality
summary(student_data$Hours_Studied[student_data$Teacher_Quality == "Low"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 19.99 24.00 39.00
summary(student_data$Hours_Studied[student_data$Teacher_Quality == "Medium"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 16 20 20 24 39
summary(student_data$Hours_Studied[student_data$Teacher_Quality == "High"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 19.93 24.00 44.00
The summary statistics of the average number of hours students study
per week based on teacher quality levels show no significant
differences. We will now use ANOVA to test for differences in study
hours based on teacher quality levels. But first, we need to check the
assumptions of ANOVA.
# Sample the data
low_teacher_quality <- student_data$Hours_Studied[student_data$Teacher_Quality == "Low"][sample(sum(student_data$Teacher_Quality == "Low"), 100)]
medium_teacher_quality <- student_data$Hours_Studied[student_data$Teacher_Quality == "Medium"][sample(sum(student_data$Teacher_Quality == "Medium"), 100)]
high_teacher_quality <- student_data$Hours_Studied[student_data$Teacher_Quality == "High"][sample(sum(student_data$Teacher_Quality == "High"), 100)]
# Histogram of study hours by teacher quality
par(mfrow = c(1, 3))
hist(low_teacher_quality, main = "Low Teacher Quality", xlab = "Study Hours", col = "skyblue", border = "black")
hist(medium_teacher_quality, main = "Medium Teacher Quality", xlab = "Study Hours", col = "skyblue", border = "black")
hist(high_teacher_quality, main = "High Teacher Quality", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(low_teacher_quality)
Shapiro-Wilk normality test
data: low_teacher_quality
W = 0.98032, p-value = 0.1407
shapiro.test(medium_teacher_quality)
Shapiro-Wilk normality test
data: medium_teacher_quality
W = 0.9862, p-value = 0.3864
shapiro.test(high_teacher_quality)
Shapiro-Wilk normality test
data: high_teacher_quality
W = 0.98852, p-value = 0.5473
All three histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
teacher quality levels.
# ANOVA test for study hours by teacher quality
anova_teacher_quality <- aov(Hours_Studied ~ Teacher_Quality, data = student_data)
summary(anova_teacher_quality)
Df Sum Sq Mean Sq F value Pr(>F)
Teacher_Quality 3 9 3.01 0.084 0.969
Residuals 6603 237062 35.90
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on teacher quality
levels, with a p-value greater than 0.05. This indicates that teacher
quality does not have a significant impact on the number of hours
students study per week.
Average Number of Hours Students Study per Week (School Type
Category)
Next, we explore the average number of hours students study per week
based on school type.
# Summary statistics for study hours by school type
summary(student_data$Hours_Studied[student_data$School_Type == "Public"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.98 24.00 43.00
summary(student_data$Hours_Studied[student_data$School_Type == "Private"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.97 24.00 44.00
The summary statistics of the average number of hours students study
per week based on school type show no significant differences. We will
now use ANOVA to test for differences in study hours based on school
type. But first, we need to check the assumptions of ANOVA.
# Sample the data
public_school <- student_data$Hours_Studied[student_data$School_Type == "Public"][sample(sum(student_data$School_Type == "Public"), 100)]
private_school <- student_data$Hours_Studied[student_data$School_Type == "Private"][sample(sum(student_data$School_Type == "Private"), 100)]
# Histogram of study hours by school type
par(mfrow = c(1, 2))
hist(public_school, main = "Public School", xlab = "Study Hours", col = "skyblue", border = "black")
hist(private_school, main = "Private School", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(public_school)
Shapiro-Wilk normality test
data: public_school
W = 0.98705, p-value = 0.4411
shapiro.test(private_school)
Shapiro-Wilk normality test
data: private_school
W = 0.98925, p-value = 0.6041
Both histograms and the Shapiro-Wilk test show that the distribution
of study hours is approximately normal for all students. We will now use
ANOVA to test for differences in study hours based on school type.
# ANOVA test for study hours by school type
anova_school_type <- aov(Hours_Studied ~ School_Type, data = student_data)
summary(anova_school_type)
Df Sum Sq Mean Sq F value Pr(>F)
School_Type 1 0 0.02 0.001 0.981
Residuals 6605 237071 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on school type,
with a p-value greater than 0.05. This indicates that school type does
not have a significant impact on the number of hours students study per
week.
Average Number of Hours Students Study per Week (Peer Influence
Category)
Next, we explore the average number of hours students study per week
based on peer influence levels.
# Summary statistics for study hours by peer influence
summary(student_data$Hours_Studied[student_data$Peer_Influence == "Positive"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 20.06 24.00 43.00
summary(student_data$Hours_Studied[student_data$Peer_Influence == "Negative"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.93 24.00 44.00
summary(student_data$Hours_Studied[student_data$Peer_Influence == "Neutral"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 19.91 24.00 39.00
The summary statistics of the average number of hours students study
per week based on peer influence levels show no significant differences.
We will now use ANOVA to test for differences in study hours based on
peer influence levels. But first, we need to check the assumptions of
ANOVA.
# Sample the data
positive_peer_influence <- student_data$Hours_Studied[student_data$Peer_Influence == "Positive"][sample(sum(student_data$Peer_Influence == "Positive"), 100)]
negative_peer_influence <- student_data$Hours_Studied[student_data$Peer_Influence == "Negative"][sample(sum(student_data$Peer_Influence == "Negative"), 100)]
neutral_peer_influence <- student_data$Hours_Studied[student_data$Peer_Influence == "Neutral"][sample(sum(student_data$Peer_Influence == "Neutral"), 100)]
# Histogram of study hours by peer influence
par(mfrow = c(1, 3))
hist(positive_peer_influence, main = "Positive Peer Influence", xlab = "Study Hours", col = "skyblue", border = "black")
hist(negative_peer_influence, main = "Negative Peer Influence", xlab = "Study Hours", col = "skyblue", border = "black")
hist(neutral_peer_influence, main = "Neutral Peer Influence", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(positive_peer_influence)
Shapiro-Wilk normality test
data: positive_peer_influence
W = 0.97318, p-value = 0.03889
shapiro.test(negative_peer_influence)
Shapiro-Wilk normality test
data: negative_peer_influence
W = 0.98153, p-value = 0.1747
shapiro.test(neutral_peer_influence)
Shapiro-Wilk normality test
data: neutral_peer_influence
W = 0.98784, p-value = 0.4962
All three histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on peer
influence levels.
# ANOVA test for study hours by peer influence
anova_peer_influence <- aov(Hours_Studied ~ Peer_Influence, data = student_data)
summary(anova_peer_influence)
Df Sum Sq Mean Sq F value Pr(>F)
Peer_Influence 2 33 16.41 0.457 0.633
Residuals 6604 237038 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on peer influence
levels, with a p-value greater than 0.05. This indicates that peer
influence does not have a significant impact on the number of hours
students study per week.
Average Number of Hours Students Study per Week (Learning Disability
Category)
Next, we explore the average number of hours students study per week
based on learning disability.
# Summary statistics for study hours by learning disability
summary(student_data$Hours_Studied[student_data$Learning_Disabilities == "Yes"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.00 16.00 20.00 19.72 24.00 35.00
summary(student_data$Hours_Studied[student_data$Learning_Disabilities == "No"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 16 20 20 24 44
The summary statistics of the average number of hours students study
per week based on learning disability show no significant differences.
We will now use ANOVA to test for differences in study hours based on
learning disability. But first, we need to check the assumptions of
ANOVA.
# Sample the data
learning_disabilities <- student_data$Hours_Studied[student_data$Learning_Disabilities == "Yes"][sample(sum(student_data$Learning_Disabilities == "Yes"), 100)]
no_learning_disabilities <- student_data$Hours_Studied[student_data$Learning_Disabilities == "No"][sample(sum(student_data$Learning_Disabilities == "No"), 100)]
# Histogram of study hours by learning disability
par(mfrow = c(1, 2))
hist(learning_disabilities, main = "Learning Disabilities", xlab = "Study Hours", col = "skyblue", border = "black")
hist(no_learning_disabilities, main = "No Learning Disabilities", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(learning_disabilities)
Shapiro-Wilk normality test
data: learning_disabilities
W = 0.97807, p-value = 0.09384
shapiro.test(no_learning_disabilities)
Shapiro-Wilk normality test
data: no_learning_disabilities
W = 0.98577, p-value = 0.3603
All histograms and the Shapiro-Wilk test show that the distribution
of study hours is approximately normal for all students. We will now use
ANOVA to test for differences in study hours based on learning
disability.
# ANOVA test for study hours by learning disability
anova_learning_disabilities <- aov(Hours_Studied ~ Learning_Disabilities, data = student_data)
summary(anova_learning_disabilities)
Df Sum Sq Mean Sq F value Pr(>F)
Learning_Disabilities 1 49 49.16 1.37 0.242
Residuals 6605 237022 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on learning
disability, with a p-value greater than 0.05. This indicates that
learning disabilities do not have a significant impact on the number of
hours students study per week.
Average Number of Hours Students Study per Week (Parental Education
Level Category)
Next, we explore the average number of hours students study per week
based on parental education levels.
# Summary statistics for study hours by parental education level
summary(student_data$Hours_Studied[student_data$Parental_Education_Level == "High School"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 20.04 24.00 44.00
summary(student_data$Hours_Studied[student_data$Parental_Education_Level == "College"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.85 24.00 39.00
summary(student_data$Hours_Studied[student_data$Parental_Education_Level == "Postgraduate"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.00 16.00 20.00 19.96 24.00 39.00
The summary statistics of the average number of hours students study
per week based on parental education levels show no significant
differences. We will now use ANOVA to test for differences in study
hours based on parental education levels. But first, we need to check
the assumptions of ANOVA.
# Sample the data
high_school_education <- student_data$Hours_Studied[student_data$Parental_Education_Level == "High School"][sample(sum(student_data$Parental_Education_Level == "High School"), 100)]
college_education <- student_data$Hours_Studied[student_data$Parental_Education_Level == "College"][sample(sum(student_data$Parental_Education_Level == "College"), 100)]
postgraduate_education <- student_data$Hours_Studied[student_data$Parental_Education_Level == "Postgraduate"][sample(sum(student_data$Parental_Education_Level == "Postgraduate"), 100)]
# Histogram of study hours by parental education level
par(mfrow = c(1, 3))
hist(high_school_education, main = "High School Education", xlab = "Study Hours", col = "skyblue", border = "black")
hist(college_education, main = "College Education", xlab = "Study Hours", col = "skyblue", border = "black")
hist(postgraduate_education, main = "Postgraduate Education", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(high_school_education)
Shapiro-Wilk normality test
data: high_school_education
W = 0.98943, p-value = 0.6185
shapiro.test(college_education)
Shapiro-Wilk normality test
data: college_education
W = 0.98364, p-value = 0.2526
shapiro.test(postgraduate_education)
Shapiro-Wilk normality test
data: postgraduate_education
W = 0.98387, p-value = 0.2624
All three histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on
parental education levels.
# ANOVA test for study hours by parental education level
anova_parental_education_level <- aov(Hours_Studied ~ Parental_Education_Level, data = student_data)
summary(anova_parental_education_level)
Df Sum Sq Mean Sq F value Pr(>F)
Parental_Education_Level 3 88 29.20 0.814 0.486
Residuals 6603 236983 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on parental
education levels, with a p-value greater than 0.05. This indicates that
parental education levels do not have a significant impact on the number
of hours students study per week.
Average Number of Hours Students Study per Week (Distance from Home
Category)
Next, we explore the average number of hours students study per week
based on the distance from home to school.
# Summary statistics for study hours by distance from home (Near, Moderate, Far
summary(student_data$Hours_Studied[student_data$Distance_from_Home == "Near"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.92 24.00 43.00
summary(student_data$Hours_Studied[student_data$Distance_from_Home == "Moderate"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 20.07 24.00 44.00
summary(student_data$Hours_Studied[student_data$Distance_from_Home == "Far"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 16.00 20.00 20.11 24.00 39.00
The summary statistics of the average number of hours students study
per week based on the distance from home to school show no significant
differences. We will now use ANOVA to test for differences in study
hours based on the distance from home to school. But first, we need to
check the assumptions of ANOVA.
# Sample the data
near_distance <- student_data$Hours_Studied[student_data$Distance_from_Home == "Near"][sample(sum(student_data$Distance_from_Home == "Near"), 100)]
moderate_distance <- student_data$Hours_Studied[student_data$Distance_from_Home == "Moderate"][sample(sum(student_data$Distance_from_Home == "Moderate"), 100)]
far_distance <- student_data$Hours_Studied[student_data$Distance_from_Home == "Far"][sample(sum(student_data$Distance_from_Home == "Far"), 100)]
# Histogram of study hours by distance from home
par(mfrow = c(1, 3))
hist(near_distance, main = "Near Distance from Home", xlab = "Study Hours", col = "skyblue", border = "black")
hist(moderate_distance, main = "Moderate Distance from Home", xlab = "Study Hours", col = "skyblue", border = "black")
hist(far_distance, main = "Far Distance from Home", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(near_distance)
Shapiro-Wilk normality test
data: near_distance
W = 0.98322, p-value = 0.2348
shapiro.test(moderate_distance)
Shapiro-Wilk normality test
data: moderate_distance
W = 0.98007, p-value = 0.1347
shapiro.test(far_distance)
Shapiro-Wilk normality test
data: far_distance
W = 0.98416, p-value = 0.276
All three histograms and the Shapiro-Wilk test show that the
distribution of study hours is approximately normal for all students. We
will now use ANOVA to test for differences in study hours based on the
distance from home to school.
# ANOVA test for study hours by distance from home
anova_distance_from_home <- aov(Hours_Studied ~ Distance_from_Home, data = student_data)
summary(anova_distance_from_home)
Df Sum Sq Mean Sq F value Pr(>F)
Distance_from_Home 3 98 32.51 0.906 0.437
Residuals 6603 236973 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study per week based on the distance
from home to school, with a p-value greater than 0.05. This indicates
that the distance from home to school does not have a significant impact
on the number of hours students study per week.
Average Number of Hours Students Study per Week (Gender
Category)
Finally, we explore the average number of hours students study per
week based on gender.
# Summary statistics
summary(student_data$Hours_Studied[student_data$Gender == "Male"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 19.95 24.00 39.00
summary(student_data$Hours_Studied[student_data$Gender == "Female"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 16.00 20.00 20.01 24.00 44.00
The summary statistics of the average number of hours students study
per week based on gender show no significant differences. We will now
use ANOVA to test for differences in study hours based on gender. But
first, we need to check the assumptions of ANOVA.
# Sample the data
male_data <- student_data$Hours_Studied[student_data$Gender == "Male"][sample(sum(student_data$Gender == "Male"), 100)]
female_data <- student_data$Hours_Studied[student_data$Gender == "Female"][sample(sum(student_data$Gender == "Female"), 100)]
# Histogram
par(mfrow = c(1, 2))
hist(male_data, main = "Male", xlab = "Study Hours", col = "skyblue", border = "black")
hist(female_data, main = "Female", xlab = "Study Hours", col = "skyblue", border = "black")

# Check assumptions of ANOVA
shapiro.test(male_data)
Shapiro-Wilk normality test
data: male_data
W = 0.98557, p-value = 0.3489
shapiro.test(female_data)
Shapiro-Wilk normality test
data: female_data
W = 0.98335, p-value = 0.24
Both histograms and the Shapiro-Wilk test show that the distribution
of study hours is approximately normal for all students. We will now use
ANOVA to test for differences in study hours based gender.
# ANOVA test
anova_gender <- aov(Hours_Studied ~ Gender, data = student_data)
summary(anova_gender)
Df Sum Sq Mean Sq F value Pr(>F)
Gender 1 4 4.26 0.119 0.73
Residuals 6605 237067 35.89
The ANOVA test shows that there is no significant difference in the
average number of hours students study based on gender.
Summary of Average Number of Hours Students Study per Week
In summary, the average number of hours students study per week is
approximately 19.98 hours. There are no significant differences in the
average number of hours students study per week based on various factors
such as parental involvement, access to resources, extracurricular
activities, motivation levels, internet access, family income, teacher
quality, school type, peer influence, learning disabilities, parental
education levels, distance from home to school, and Gender. This
indicates that the number of hours students study per week is consistent
across different factors.
LS0tDQp0aXRsZTogIkdlbmVyYWwgVHJlbmRzIGFuZCBEZXNjcmlwdGl2ZSBBbmFseXNpcyINCmF1dGhvcjogIiZjb3B5OyBIZWN0b3IgTWF0aG9uc2kiDQpkYXRlOiAyMDI0LTEwLTE5DQpvdXRwdXQ6DQogICAgaHRtbF9ub3RlYm9vazoNCiAgICAgICAgdGhlbWU6IGZsYXRseQ0KICAgICAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgICAgIHRvYzogdHJ1ZQ0KICAgICAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQotLS0tLQ0KDQojIEFic3RyYWN0DQoNClRoaXMgcmVwb3J0IGV4cGxvcmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaW91cyBmYWN0b3JzIGluZmx1ZW5jaW5nIHN0dWRlbnQgcGVyZm9ybWFuY2UsIHVzaW5nIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgKEVEQSkgdG8gaWRlbnRpZnkga2V5IHRyZW5kcyBhbmQgY29ycmVsYXRpb25zLiBUaGUgYW5hbHlzaXMgZm9jdXNlcyBvbiB2YXJpYWJsZXMgc3VjaCBhcyBzdHVkeSBoYWJpdHMsIGFjY2VzcyB0byByZXNvdXJjZXMsIHBhcmVudGFsIGludm9sdmVtZW50LCBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzLCBhbmQgaG93IHRoZXkgaW1wYWN0IGZpbmFsIGV4YW0gc2NvcmVzLiBJbnNpZ2h0cyBnYWluZWQgZnJvbSB0aGUgZGF0YSB3aWxsIGluZm9ybSByZWNvbW1lbmRhdGlvbnMgYWltZWQgYXQgaW1wcm92aW5nIGFjYWRlbWljIG91dGNvbWVzIGZvciBzdHVkZW50cy4NCg0KIyBEYXRhIFNvdXJjZQ0KDQpUaGUgZGF0YXNldCB3YXMgc291cmNlZCBmcm9tIEthZ2dsZSB1bmRlciB0aGUgQ0MwIDEuMCB1bml2ZXJzYWwgIk5vIENvcHlyaWdodCIgbGljZW5zZS4gV2UgYXJlIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBwZXJmb3JtIHRoZSB3b3JrLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLCBhbGwgd2l0aG91dCBhc2tpbmcgcGVybWlzc2lvbi4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGxpY2Vuc2UgaGVyZSBbaGVyZV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8pLg0KDQpVUkwgZm9yIGRhdGEgaW4gS2FnZ2xlOiBbU3R1ZGVudCBQZXJmb3JtYW5jZSBGYWN0b3JzIERhdGFzZXRdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbGFpbmd1eW4xMjMvc3R1ZGVudC1wZXJmb3JtYW5jZS1mYWN0b3JzKQ0KDQojIEltcG9ydCBhbmQgVmlldyBEYXRhDQoNCmBgYHtyfQ0Kc3R1ZGVudF9kYXRhIDwtIHJlYWQuY3N2KCcuLi9kYXRhL1N0dWRlbnRQZXJmb3JtYW5jZUZhY3RvcnMuY3N2JywgaGVhZGVyID0gVFJVRSkNCnN0dWRlbnRfZGF0YSAgICAjIERpc3BsYXkgdGhlIGRhdGFzZXQNCmBgYA0KDQojIyMgU3VtbWFyeSBTdGF0aXN0aWNzDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGFsbCB2YXJpYWJsZXMNCnN1bW1hcnkoc3R1ZGVudF9kYXRhKSAgICMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBhbGwgdmFyaWFibGVzDQpoZWFkKHN0dWRlbnRfZGF0YSkgICAgICAjIERpc3BsYXkgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSBkYXRhc2V0DQpzdHIoc3R1ZGVudF9kYXRhKSAgICAgICAjIFN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldA0Kc3VtKGlzLm5hKHN0dWRlbnRfZGF0YSkpICAgICMgQ2hlY2sgZm9yIG1pc3NpbmcgdmFsdWVzDQpgYGANCg0KIyBEaXN0cmlidXRpb24gb2YgRmluYWwgRXhhbSBTY29yZXMNCg0KIyMgRGlzdHJpYnV0aW9uIG9mIEZpbmFsIEV4YW0gU2NvcmVzKFdpdGhvdXQgQ29uc2lkZXJpbmcgT3RoZXIgRmFjdG9ycykNCkhlcmUgd2Ugd2lsbCBleHBsb3JlIHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgYW1vbmcgc3R1ZGVudHMgd2l0aCB3aXRob3V0IGNvbnNpZGVyaW5nIG90aGVyIGZhY3RvcnMuDQpUbyBmaW5kIG91ciB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzLCB3ZSBmaXJzdCBuZWVkIHRvIHNhbXBsZSB0aGUgZGF0YSBhbmQgcGxvdCBhIGhpc3RvZ3JhbS4NCmBgYHtyfQ0KIyBTYW1wbGUgdGhlIGRhdGENCnNldC5zZWVkKDEyMykNCmV4YW1fc2NvcmVfc2FtcGxlIDwtIHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlW3NhbXBsZShucm93KHN0dWRlbnRfZGF0YSksIDEwMCldDQpleGFtX3Njb3JlX3NhbXBsZQ0KDQojIFBsb3QgaGlzdG9ncmFtDQpoaXN0KGV4YW1fc2NvcmVfc2FtcGxlLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBGaW5hbCBFeGFtIFNjb3JlcyIsIHhsYWIgPSAiRmluYWwgRXhhbSBTY29yZSIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmBgYA0KDQpGcm9tIHRoZSBoaXN0b2dyYW0sIHdlIGNhbiBzZWUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsLiBXZSBub3cgcGxvdCBhIGJveHBsb3QgdG8gdmlzdWFsaXplIHRoZSBzcHJlYWQgb2Ygc2NvcmVzIGFuZCBpZGVudGlmeSBhbnkgb3V0bGllcnMuDQpgYGB7cn0NCiMgQm94cGxvdCBvZiBmaW5hbCBleGFtIHNjb3Jlcw0KYm94cGxvdChleGFtX3Njb3JlX3NhbXBsZSwgbWFpbiA9ICJCb3hwbG90IG9mIEZpbmFsIEV4YW0gU2NvcmVzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KYGBgDQoNClRoZSBib3hwbG90IHNob3dzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBpcyBjZW50ZXJlZCBhcm91bmQgdGhlIG1lZGlhbiwgd2l0aCBhIGZldyBvdXRsaWVycyBvbiB0aGUgbG93ZXIgZW5kIG9mIHRoZSBzY2FsZS4gTm93IHdlIHVzZSBudW1lcmljYWwgbWV0aG9kcyB0byBjb25maXJtIHRoZSBub3JtYWxpdHkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCmBgYHtyfQ0KIyBTaGFwaXJvLVdpbGsgdGVzdCBmb3Igbm9ybWFsaXR5DQpzaGFwaXJvLnRlc3QoZXhhbV9zY29yZV9zYW1wbGUpDQpgYGANCg0KVGhlIFNoYXBpcm8tV2lsayB0ZXN0IGNvbmZpcm1zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuDQoNCiMjIERpc3RyaWJ1dGlvbiBvZiBGaW5hbCBFeGFtIFNjb3JlcyAoUGFyZW50YWxfSW52b2x2ZW1lbnQgQ2F0ZWdvcnkpDQoNCk5leHQsIHdlIGV4cGxvcmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBiYXNlZCBvbiBwYXJlbnRhbCBpbnZvbHZlbWVudCBsZXZlbHMuIFdlIHdpbGwgY3JlYXRlIGEgYm94cGxvdCB0byBjb21wYXJlIHRoZSBzY29yZXMgb2Ygc3R1ZGVudHMgd2l0aCBkaWZmZXJlbnQgbGV2ZWxzIG9mIHBhcmVudGFsIGludm9sdmVtZW50Lg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KaGlnaF9wYXJlbnRhbF9pbnZvbHZlbWVudCA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkUGFyZW50YWxfSW52b2x2ZW1lbnQgPT0gIkhpZ2giXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiSGlnaCIpLCAxMDApXQ0KbWVkaXVtX3BhcmVudGFsX2ludm9sdmVtZW50IDwtIHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiTWVkaXVtIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkUGFyZW50YWxfSW52b2x2ZW1lbnQgPT0gIk1lZGl1bSIpLCAxMDApXQ0KbG93X3BhcmVudGFsX2ludm9sdmVtZW50IDwtIHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiTG93Il1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkUGFyZW50YWxfSW52b2x2ZW1lbnQgPT0gIkxvdyIpLCAxMDApXQ0KDQojIEhpc3RvZ3JhbSBvZiBmaW5hbCBleGFtIHNjb3JlcyBieSBwYXJlbnRhbCBpbnZvbHZlbWVudA0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QoaGlnaF9wYXJlbnRhbF9pbnZvbHZlbWVudCwgbWFpbiA9ICJIaWdoIFBhcmVudGFsIEludm9sdmVtZW50IiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChtZWRpdW1fcGFyZW50YWxfaW52b2x2ZW1lbnQsIG1haW4gPSAiTWVkaXVtIFBhcmVudGFsIEludm9sdmVtZW50IiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChsb3dfcGFyZW50YWxfaW52b2x2ZW1lbnQsIG1haW4gPSAiTG93IFBhcmVudGFsIEludm9sdmVtZW50IiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KYGBgDQoNClRoZSB0aHJlZSBoaXN0b2dyYW1zIHNob3cgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBoaWdoLCBtZWRpdW0sIGFuZCBsb3cgbGV2ZWxzIG9mIHBhcmVudGFsIGludm9sdmVtZW50LiBXZSBjYW4gc2VlIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2NvcmVzIHNlZW1zIHRvIGJlIHNpbWlsYXIgYWNyb3NzIGFsbCB0aHJlZSBjYXRlZ29yaWVzLiBUaGV5IHNlZW0gdG8gZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2l0aCBhIHNsaWdodCBza2V3IHRvd2FyZHMgaGlnaGVyIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBoaWdoIHBhcmVudGFsIGludm9sdmVtZW50Lg0KV2Ugbm93IHVzZSBudW1lcmljYWwgbWV0aG9kcyB0byBjb25maXJtIHRoZSBub3JtYWxpdHkgb2YgdGhlIGRpc3RyaWJ1dGlvbnMuDQpgYGB7cn0NCiMgU2hhcGlyby1XaWxrIHRlc3QgZm9yIG5vcm1hbGl0eQ0Kc2hhcGlyby50ZXN0KGhpZ2hfcGFyZW50YWxfaW52b2x2ZW1lbnQpDQpzaGFwaXJvLnRlc3QobWVkaXVtX3BhcmVudGFsX2ludm9sdmVtZW50KQ0Kc2hhcGlyby50ZXN0KGxvd19wYXJlbnRhbF9pbnZvbHZlbWVudCkNCmBgYA0KDQpUaGUgU2hhcGlyby1XaWxrIHRlc3QgY29uZmlybXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBoaWdoIGFuZCBtZWRpdW0gbGV2ZWxzIG9mIHBhcmVudGFsIGludm9sdmVtZW50IGFyZSBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgd2l0aCBwLXZhbHVlcyBncmVhdGVyIHRoYW4gMC4wNS4gSG93ZXZlciwgdGhlIGRpc3RyaWJ1dGlvbiBmb3Igc3R1ZGVudHMgd2l0aCBsb3cgcGFyZW50YWwgaW52b2x2ZW1lbnQgaXMgc2xpZ2h0bHkgc2tld2VkLCB3aXRoIGEgcC12YWx1ZSBsZXNzIHRoYW4gMC4wNS4NCg0KV2Ugbm93IGludmVzdGlnYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgZm9yIHN0dWRlbnRzIHdpdGggbG93IHBhcmVudGFsIGludm9sdmVtZW50IGZ1cnRoZXIuIFdlIHdpbGwgbm93IHBsb3QgYSBkZW5zaXR5IHBsb3QgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb24gbW9yZSBjbGVhcmx5Lg0KYGBge3J9DQojIERlbnNpdHkgcGxvdCBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBsb3cgcGFyZW50YWwgaW52b2x2ZW1lbnQNCnBsb3QoZGVuc2l0eShsb3dfcGFyZW50YWxfaW52b2x2ZW1lbnQpLCBtYWluID0gIkRlbnNpdHkgUGxvdCBvZiBGaW5hbCBFeGFtIFNjb3JlcyBmb3IgTG93IFBhcmVudGFsIEludm9sdmVtZW50IiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiKQ0KYGBgDQoNClRoZSBkZW5zaXR5IHBsb3Qgc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gaXMgc2xpZ2h0bHkgc2tld2VkIHRvIHRoZSBsZWZ0IGZvciBzdHVkZW50cyB3aXRoIGxvdyBwYXJlbnRhbCBpbnZvbHZlbWVudC4gV2Ugd2lsbCBub3cgY3JlYXRlIGEgUVEgcGxvdCB0byBjb21wYXJlIHRoZSBkaXN0cmlidXRpb24gb2Ygc2NvcmVzIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCg0KYGBge3J9DQojIFFRIHBsb3Qgb2YgZmluYWwgZXhhbSBzY29yZXMgZm9yIHN0dWRlbnRzIHdpdGggbG93IHBhcmVudGFsIGludm9sdmVtZW50DQpxcW5vcm0obG93X3BhcmVudGFsX2ludm9sdmVtZW50LCBtYWluID0gIlFRIFBsb3Qgb2YgRmluYWwgRXhhbSBTY29yZXMgZm9yIExvdyBQYXJlbnRhbCBJbnZvbHZlbWVudCIsIGNvbCA9ICJza3libHVlIikNCnFxbGluZShsb3dfcGFyZW50YWxfaW52b2x2ZW1lbnQsIGNvbCA9ICJyZWQiKQ0KYGBgDQoNClRoZSBRUSBwbG90IGNvbmZpcm1zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBsb3cgcGFyZW50YWwgaW52b2x2ZW1lbnQgaXMgc2xpZ2h0bHkgc2tld2VkIHRvIHRoZSBsZWZ0LCBkZXZpYXRpbmcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uDQoNCiMjIERpc3RyaWJ1dGlvbiBvZiBGaW5hbCBFeGFtIFNjb3JlcyAoQWNjZXNzX3RvX1Jlc291cmNlcyBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGJhc2VkIG9uIGFjY2VzcyB0byByZXNvdXJjZXMuIFdlIHdpbGwgY3JlYXRlIGEgYm94cGxvdCB0byBjb21wYXJlIHRoZSBzY29yZXMgb2Ygc3R1ZGVudHMgd2l0aCBkaWZmZXJlbnQgbGV2ZWxzIG9mIGFjY2VzcyB0byByZXNvdXJjZXMuDQpgYGB7cn0NCiMgU2FtcGxlIHRoZSBkYXRhDQpoaWdoX2FjY2Vzc190b19yZXNvdXJjZXMgPC0gc3R1ZGVudF9kYXRhJEV4YW1fU2NvcmVbc3R1ZGVudF9kYXRhJEFjY2Vzc190b19SZXNvdXJjZXMgPT0gIkhpZ2giXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRBY2Nlc3NfdG9fUmVzb3VyY2VzID09ICJIaWdoIiksIDEwMCldDQptZWRpdW1fYWNjZXNzX3RvX3Jlc291cmNlcyA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiTWVkaXVtIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiTWVkaXVtIiksIDEwMCldDQpsb3dfYWNjZXNzX3RvX3Jlc291cmNlcyA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiTG93Il1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiTG93IiksIDEwMCldDQoNCiMgSGlzdG9ncmFtIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGJ5IGFjY2VzcyB0byByZXNvdXJjZXMNCnBhcihtZnJvdyA9IGMoMSwgMykpDQpoaXN0KGhpZ2hfYWNjZXNzX3RvX3Jlc291cmNlcywgbWFpbiA9ICJIaWdoIEFjY2VzcyB0byBSZXNvdXJjZXMiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KG1lZGl1bV9hY2Nlc3NfdG9fcmVzb3VyY2VzLCBtYWluID0gIk1lZGl1bSBBY2Nlc3MgdG8gUmVzb3VyY2VzIiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChsb3dfYWNjZXNzX3RvX3Jlc291cmNlcywgbWFpbiA9ICJMb3cgQWNjZXNzIHRvIFJlc291cmNlcyIsIHhsYWIgPSAiRmluYWwgRXhhbSBTY29yZSIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCg0KcGxvdChkZW5zaXR5KGxvd19hY2Nlc3NfdG9fcmVzb3VyY2VzKSwgbWFpbiA9ICJMb3cgQWNjZXNzIHRvIFJlc291cmNlcyIsIHhsYWIgPSAiRmluYWwgRXhhbSBTY29yZSIsIGNvbCA9ICJza3libHVlIikNCnBsb3QoZGVuc2l0eShtZWRpdW1fYWNjZXNzX3RvX3Jlc291cmNlcyksIG1haW4gPSAiTWVkaXVtIEFjY2VzcyB0byBSZXNvdXJjZXMiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIpDQpwbG90KGRlbnNpdHkoaGlnaF9hY2Nlc3NfdG9fcmVzb3VyY2VzKSwgbWFpbiA9ICJIaWdoIEFjY2VzcyB0byBSZXNvdXJjZXMiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIpDQpgYGANCg0KVGhlIGhpc3RvZ3JhbXMgYW5kIGRlbnNpdHkgcGxvdHMgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGZvciBzdHVkZW50cyB3aXRoIGhpZ2gsIG1lZGl1bSwgYW5kIGxvdyBsZXZlbHMgb2YgYWNjZXNzIHRvIHJlc291cmNlcy4gVGhlIGRpc3RyaWJ1dGlvbnMgc2VlbSB0byBiZSBzaW1pbGFyIGFjcm9zcyBhbGwgdGhyZWUgY2F0ZWdvcmllcywgd2l0aCBhIHNsaWdodCBza2V3IHRvd2FyZHMgaGlnaGVyIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBoaWdoIGFjY2VzcyB0byByZXNvdXJjZXMuIFdlIHdpbGwgbm93IHVzZSBudW1lcmljYWwgbWV0aG9kcyB0byBjb25maXJtIHRoZSBub3JtYWxpdHkgb2YgdGhlIGRpc3RyaWJ1dGlvbnMuDQoNCmBgYHtyfQ0KIyBTaGFwaXJvLVdpbGsgdGVzdCBmb3Igbm9ybWFsaXR5DQpzaGFwaXJvLnRlc3QoaGlnaF9hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0Kc2hhcGlyby50ZXN0KG1lZGl1bV9hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0Kc2hhcGlyby50ZXN0KGxvd19hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0KYGBgDQoNClRoZSBTaGFwaXJvLVdpbGsgdGVzdCBzaG93cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgYWxsIHRocmVlIGNhdGVnb3JpZXMgb2YgYWNjZXNzIHRvIHJlc291cmNlcyBpcyBub3Qgbm9ybWFsLCB3aXRoIHAtdmFsdWVzIGxlc3MgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgaXMgc2tld2VkIGZvciBzdHVkZW50cyB3aXRoIGRpZmZlcmVudCBsZXZlbHMgb2YgYWNjZXNzIHRvIHJlc291cmNlcy4NCg0KIyMgRGlzdHJpYnV0aW9uIG9mIEZpbmFsIEV4YW0gU2NvcmVzIChFeHRyYWN1cnJpY3VsYXJfQWN0aXZpdGllcyBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGJhc2VkIG9uIHBhcnRpY2lwYXRpb24gaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMuIFdlIHdpbGwgY3JlYXRlIGEgYm94cGxvdCB0byBjb21wYXJlIHRoZSBzY29yZXMgb2Ygc3R1ZGVudHMgd2hvIHBhcnRpY2lwYXRlIGluIGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzIGFuZCB0aG9zZSB3aG8gZG8gbm90Lg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KcGFydGljaXBhdGVfZXh0cmFjdXJyaWN1bGFyIDwtIHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlW3N0dWRlbnRfZGF0YSRFeHRyYWN1cnJpY3VsYXJfQWN0aXZpdGllcyA9PSAiWWVzIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIlllcyIpLCAxMDApXQ0KZG9fbm90X3BhcnRpY2lwYXRlX2V4dHJhY3VycmljdWxhciA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIk5vIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIk5vIiksIDEwMCldDQoNCiMgQm94cGxvdCBvZiBmaW5hbCBleGFtIHNjb3JlcyBieSBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcw0KYm94cGxvdChzdHVkZW50X2RhdGEkRXhhbV9TY29yZSB+IHN0dWRlbnRfZGF0YSRFeHRyYWN1cnJpY3VsYXJfQWN0aXZpdGllcywgbWFpbiA9ICJGaW5hbCBFeGFtIFNjb3JlcyBieSBFeHRyYWN1cnJpY3VsYXIgQWN0aXZpdGllcyIsIHhsYWIgPSAiRXh0cmFjdXJyaWN1bGFyIEFjdGl2aXRpZXMiLCB5bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpgYGANCg0KVGhlIGJveHBsb3Qgc2hvd3MgdGhhdCBzdHVkZW50cyB3aG8gcGFydGljaXBhdGUgaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMgdGVuZCB0byBoYXZlIGhpZ2hlciBmaW5hbCBleGFtIHNjb3JlcyBjb21wYXJlZCB0byB0aG9zZSB3aG8gZG8gbm90LiBOb3cgd2Ugd2lsbCB2aXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzY29yZXMgZm9yIGJvdGggZ3JvdXBzIHVzaW5nIGhpc3RvZ3JhbXMuDQpgYGB7cn0NCiMgSGlzdG9ncmFtIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGJ5IGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KaGlzdChwYXJ0aWNpcGF0ZV9leHRyYWN1cnJpY3VsYXIsIG1haW4gPSAiRXh0cmFjdXJyaWN1bGFyIEFjdGl2aXRpZXMiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KGRvX25vdF9wYXJ0aWNpcGF0ZV9leHRyYWN1cnJpY3VsYXIsIG1haW4gPSAiTm8gRXh0cmFjdXJyaWN1bGFyIEFjdGl2aXRpZXMiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpgYGANCg0KQm90aCBoaXN0b2dyYW1zIHNob3cgcmlnaHQgc2tld2VkIGRpc3RyaWJ1dGlvbnMsIHdpdGggc3R1ZGVudHMgd2hvIHBhcnRpY2lwYXRlIGluIGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzIGhhdmluZyBoaWdoZXIgZmluYWwgZXhhbSBzY29yZXMuIFdlIHdpbGwgbm93IHVzZSBudW1lcmljYWwgbWV0aG9kcyB0byBjb25maXJtIHRoZSBub3JtYWxpdHkgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdGVzdC4NCg0KLSBOdWxsIEh5cG90aGVzaXMgKCRIXzAkKTogVGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2hvIHBhcnRpY2lwYXRlIGluIGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzIGlzIG5vcm1hbC4NCi0gQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoJEhfMSQpOiBUaGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGZvciBzdHVkZW50cyB3aG8gcGFydGljaXBhdGUgaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMgaXMgbm90IG5vcm1hbC4NCg0KYGBge3J9DQojIFNoYXBpcm8tV2lsayB0ZXN0IGZvciBub3JtYWxpdHkNCnNoYXBpcm8udGVzdChwYXJ0aWNpcGF0ZV9leHRyYWN1cnJpY3VsYXIpDQpgYGANCg0KVGhlIFNoYXBpcm8tV2lsayB0ZXN0IGNvbmZpcm1zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2hvIHBhcnRpY2lwYXRlIGluIGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzIGlzIG5vdCBub3JtYWwsIHdpdGggYSBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1LiBUaHVzLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4NCg0KIyMgRGlzdHJpYnV0aW9uIG9mIEZpbmFsIEV4YW0gU2NvcmVzIChNb3RpdmF0aW9uX0xldmVsIENhdGVnb3J5KQ0KDQpOZXh0IHdlIGV4cGxvcmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBmaW5hbCBleGFtIHNjb3JlcyBiYXNlZCBvbiBtb3RpdmF0aW9uIGxldmVscy4gV2Ugd2lsbCBjcmVhdGUgYSBoaXN0b2dyYW0gdG8gY29tcGFyZSB0aGUgc2NvcmVzIG9mIHN0dWRlbnRzIHdpdGggZGlmZmVyZW50IG1vdGl2YXRpb24gbGV2ZWxzLg0KYGBge3J9DQojIFNtYXBsZSBEYXRhDQpoaWdoX21vdGl2YXRpb24gPC0gc3R1ZGVudF9kYXRhJEV4YW1fU2NvcmVbc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIkhpZ2giXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRNb3RpdmF0aW9uX0xldmVsID09ICJIaWdoIiksIDEwMCldDQptZWRpdW1fbW90aXZhdGlvbiA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkTW90aXZhdGlvbl9MZXZlbCA9PSAiSGlnaCJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIk1lZGl1bSIpLCAxMDApXQ0KbG93X21vdGl2YXRpb24gPC0gc3R1ZGVudF9kYXRhJEV4YW1fU2NvcmVbc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIkhpZ2giXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRNb3RpdmF0aW9uX0xldmVsID09ICJMb3ciKSwgMTAwKV0NCg0KIyBIaXN0b2dyYW0gb2YgZmluYWwgZXhhbSBzY29yZXMgYnkgbW90aXZhdGlvbiBsZXZlbA0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QoaGlnaF9tb3RpdmF0aW9uLCBtYWluID0gIkhpZ2ggTW90aXZhdGlvbiBMZXZlbCIsIHhsYWIgPSAiRmluYWwgRXhhbSBTY29yZSIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QobWVkaXVtX21vdGl2YXRpb24sIG1haW4gPSAiTWVkaXVtIE1vdGl2YXRpb24gTGV2ZWwiLCB4bGFiID0gIkZpbmFsIEV4YW0gU2NvcmUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KGxvd19tb3RpdmF0aW9uLCBtYWluID0gIkxvdyBNb3RpdmF0aW9uIExldmVsIiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KYGBgDQoNClRoZSBoaXN0b2dyYW1zIGZvciBIaWdoIGFuZCBtZWRpdW0gbW90aXZhdGlvbiBsZXZlbHMgc2hvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMsIHdoaWxlIHRoZSBsb3cgbW90aXZhdGlvbiBsZXZlbCBoaXN0b2dyYW0gc2hvd3MgYSByaWdodC1za2V3ZWQgZGlzdHJpYnV0aW9uLiBXZSB3aWxsIG5vdyB1c2UgbnVtZXJpY2FsIG1ldGhvZHMgdG8gY29uZmlybSB0aGUgbm9ybWFsaXR5IG9mIHRoZSBkaXN0cmlidXRpb25zLg0KDQpgYGB7cn0NCiMgU2hhcGlyby1XaWxrIHRlc3QgZm9yIG5vcm1hbGl0eQ0Kc2hhcGlyby50ZXN0KGhpZ2hfbW90aXZhdGlvbikNCnNoYXBpcm8udGVzdChtZWRpdW1fbW90aXZhdGlvbikNCnNoYXBpcm8udGVzdChsb3dfbW90aXZhdGlvbikNCmBgYA0KDQpUaGUgU2hhcGlyby1XaWxrIHRlc3QgY29uZmlybXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiBmaW5hbCBleGFtIHNjb3JlcyBmb3Igc3R1ZGVudHMgd2l0aCBoaWdoIGFuZCBtZWRpdW0gbW90aXZhdGlvbiBsZXZlbHMgYXJlIGFwcHJveGltYXRlbHkgbm9ybWFsLCB3aXRoIHAtdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjA1LiBIb3dldmVyLCB0aGUgZGlzdHJpYnV0aW9uIGZvciBzdHVkZW50cyB3aXRoIGxvdyBtb3RpdmF0aW9uIGxldmVscyBpcyBzbGlnaHRseSBza2V3ZWQsIHdpdGggYSBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1Lg0KDQojIyBEaXN0cmlidXRpb24gb2YgRmluYWwgRXhhbSBTY29yZXMgKEludGVybmV0X0FjY2VzcyBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGZpbmFsIGV4YW0gc2NvcmVzIGJhc2VkIG9uIGludGVybmV0IGFjY2Vzcy4gV2Ugd2lsbCBjcmVhdGUgYSBib3hwbG90IHRvIGNvbXBhcmUgdGhlIHNjb3JlcyBvZiBzdHVkZW50cyB3aXRoIGFuZCB3aXRob3V0IGludGVybmV0IGFjY2Vzcy4NCmBgYHtyfQ0KIyBTYW1wbGUgdGhlIGRhdGENCmludGVybmV0X2FjY2VzcyA8LSBzdHVkZW50X2RhdGEkRXhhbV9TY29yZVtzdHVkZW50X2RhdGEkSW50ZXJuZXRfQWNjZXNzID09ICJZZXMiXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRJbnRlcm5ldF9BY2Nlc3MgPT0gIlllcyIpLCAxMDApXQ0Kbm9faW50ZXJuZXRfYWNjZXNzIDwtIHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlW3N0dWRlbnRfZGF0YSRJbnRlcm5ldF9BY2Nlc3MgPT0gIk5vIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkSW50ZXJuZXRfQWNjZXNzID09ICJObyIpLCAxMDApXQ0KDQojIEJveHBsb3Qgb2YgZmluYWwgZXhhbSBzY29yZXMgYnkgaW50ZXJuZXQgYWNjZXNzDQpib3hwbG90KHN0dWRlbnRfZGF0YSRFeGFtX1Njb3JlIH4gc3R1ZGVudF9kYXRhJEludGVybmV0X0FjY2VzcywgbWFpbiA9ICJGaW5hbCBFeGFtIFNjb3JlcyBieSBJbnRlcm5ldCBBY2Nlc3MiLCB4bGFiID0gIkludGVybmV0IEFjY2VzcyIsIHlsYWIgPSAiRmluYWwgRXhhbSBTY29yZSIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCg0KIyBIaXN0b2dyYW0gb2YgZmluYWwgZXhhbSBzY29yZXMgYnkgaW50ZXJuZXQgYWNjZXNzDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KaGlzdChpbnRlcm5ldF9hY2Nlc3MsIG1haW4gPSAiSW50ZXJuZXQgQWNjZXNzIiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChub19pbnRlcm5ldF9hY2Nlc3MsIG1haW4gPSAiTm8gSW50ZXJuZXQgQWNjZXNzIiwgeGxhYiA9ICJGaW5hbCBFeGFtIFNjb3JlIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIFNoYXBpcm8tV2lsayB0ZXN0IGZvciBub3JtYWxpdHkNCnNoYXBpcm8udGVzdChpbnRlcm5ldF9hY2Nlc3MpDQpzaGFwaXJvLnRlc3Qobm9faW50ZXJuZXRfYWNjZXNzKQ0KYGBgDQoNClRoZSBib3hwbG90IHNob3dzIHRoYXQgc3R1ZGVudHMgd2l0aCBpbnRlcm5ldCBhY2Nlc3MgdGVuZCB0byBoYXZlIGhpZ2hlciBmaW5hbCBleGFtIHNjb3JlcyBjb21wYXJlZCB0byB0aG9zZSB3aXRob3V0IGludGVybmV0IGFjY2Vzcy4gVGhlIGhpc3RvZ3JhbXMgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgZm9yIHN0dWRlbnRzIHdpdGggbm8gaW50ZXJuZXQgYWNjZXNzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsLCB3aGlsZSB0aGUgZGlzdHJpYnV0aW9uIGZvciBzdHVkZW50cyB3aXRoIGludGVybmV0IGFjY2VzcyBpcyBzbGlnaHRseSBza2V3ZWQuIFRoZSBTaGFwaXJvLVdpbGsgdGVzdCBjb25maXJtcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgZm9yIHN0dWRlbnRzIHdpdGhvdXQgaW50ZXJuZXQgYWNjZXNzIGlzIG5vcm1hbCwgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuIEhvd2V2ZXIsIHRoZSBkaXN0cmlidXRpb24gZm9yIHN0dWRlbnRzIHdpdGggaW50ZXJuZXQgYWNjZXNzIGlzIHNsaWdodGx5IHNrZXdlZCwgd2l0aCBhIHAtdmFsdWUgbGVzcyB0aGFuIDAuMDUuDQoNCiMjIFN1bW1hcnkgb2YgRGlzdHJpYnV0aW9uIEFuYWx5c2lzDQoNCkluIHN1bW1hcnksIHRoZSBkaXN0cmlidXRpb24gb2YgZmluYWwgZXhhbSBzY29yZXMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgd2hlbiBjb25zaWRlcmluZyBhbGwgc3R1ZGVudHMuIEhvd2V2ZXIsIHdoZW4gZXhhbWluaW5nIHRoZSBzY29yZXMgYmFzZWQgb24gb3RoZXIgZmFjdG9ycyBzdWNoIGFzIHBhcmVudGFsIGludm9sdmVtZW50LCBhY2Nlc3MgdG8gcmVzb3VyY2VzLCBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcywgYW5kIG1vdGl2YXRpb24gbGV2ZWxzLCB0aGUgZGlzdHJpYnV0aW9ucyB2YXJ5LiBTdHVkZW50cyB3aXRoIGhpZ2ggcGFyZW50YWwgaW52b2x2ZW1lbnQgYW5kIGhpZ2ggYWNjZXNzIHRvIHJlc291cmNlcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIGZpbmFsIGV4YW0gc2NvcmVzLCB3aGlsZSBzdHVkZW50cyB3aG8gcGFydGljaXBhdGUgaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMgYWxzbyBwZXJmb3JtIGJldHRlci4gTW90aXZhdGlvbiBsZXZlbHMgYWxzbyBwbGF5IGEgcm9sZSBpbiBzdHVkZW50IHBlcmZvcm1hbmNlLCB3aXRoIHN0dWRlbnRzIHdobyBhcmUgaGlnaGx5IG1vdGl2YXRlZCBhY2hpZXZpbmcgaGlnaGVyIHNjb3Jlcy4NCg0KIyBBdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlaw0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoV2l0aG91dCBDb25zaWRlcmluZyBPdGhlciBGYWN0b3JzKQ0KDQpOZXh0LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayB3aXRob3V0IGNvbnNpZGVyaW5nIG90aGVyIGZhY3RvcnMuDQpgYGB7cn0NCiMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBzdHVkeSBob3Vycw0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZCkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIHNob3cgdGhhdCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgaXMgYXBwcm94aW1hdGVseSAxOS45OCBob3Vycy4gV2Ugd2lsbCBub3cgdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgdXNpbmcgYSBoaXN0b2dyYW0uDQpgYGB7cn0NCiMgSGlzdG9ncmFtIG9mIHN0dWR5IGhvdXJzDQpoaXN0KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBTdHVkeSBIb3VycyIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpgYGANCg0KVGhlIGRpc3RyaWJ1dGlvbiBvZiBzdHVkeSBob3VycyBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbC4gV2Ugd2lsbCBub3cgdXNlIG51bWVyaWNhbCBtZXRob2RzIHRvIGNvbmZpcm0gdGhlIG5vcm1hbGl0eSBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQpgYGB7cn0NCiMgU2hhcGlyby1XaWxrIHRlc3QgZm9yIG5vcm1hbGl0eQ0Kc2FtcGxlX2hvdXJzX3N0dWRpZWQgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc2FtcGxlKG5yb3coc3R1ZGVudF9kYXRhKSwgMTAwKV0NCnNoYXBpcm8udGVzdChzYW1wbGVfaG91cnNfc3R1ZGllZCkNCmBgYA0KDQpUaGUgcC12YWx1ZSBpcyBncmVhdGVyIHRoYW4gMC4wNSwgaW5kaWNhdGluZyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwuDQoNCiMjIEF2ZXJhZ2UgTnVtYmVyIG9mIEhvdXJzIFN0dWRlbnRzIFN0dWR5IHBlciBXZWVrIChQYXJlbnRhbF9JbnZvbHZlbWVudCBDYXRlZ29yeSkNCg0KTmV4dCwgd2Ugd2lsbCBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBwYXJlbnRhbCBpbnZvbHZlbWVudCBsZXZlbHMuDQpgYGB7cn0NCiMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBzdHVkeSBob3VycyBieSBwYXJlbnRhbCBpbnZvbHZlbWVudA0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkUGFyZW50YWxfSW52b2x2ZW1lbnQgPT0gIkhpZ2giXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0ludm9sdmVtZW50ID09ICJNZWRpdW0iXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0ludm9sdmVtZW50ID09ICJMb3ciXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBwYXJlbnRhbCBpbnZvbHZlbWVudCBsZXZlbHMgZG8gbm90IHNob3cgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiBwYXJlbnRhbCBpbnZvbHZlbWVudCBsZXZlbHMuIEJ1dCBmaXJzdCwgd2UgbmVlZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbnMgb2YgQU5PVkEuDQpgYGB7cn0NCiMgU2FtcGxlIHRoZSBkYXRhDQpoaWdoX3BhcmVudGFsX2ludm9sdmVtZW50IDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiSGlnaCJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFBhcmVudGFsX0ludm9sdmVtZW50ID09ICJIaWdoIiksIDEwMCldDQptZWRpdW1fcGFyZW50YWxfaW52b2x2ZW1lbnQgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0ludm9sdmVtZW50ID09ICJNZWRpdW0iXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiTWVkaXVtIiksIDEwMCldDQpsb3dfcGFyZW50YWxfaW52b2x2ZW1lbnQgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0ludm9sdmVtZW50ID09ICJMb3ciXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRQYXJlbnRhbF9JbnZvbHZlbWVudCA9PSAiTG93IiksIDEwMCldDQoNCiMgSGlzdG9ncmFtIG9mIHN0dWR5IGhvdXJzIGJ5IHBhcmVudGFsIGludm9sdmVtZW50DQpwYXIobWZyb3cgPSBjKDEsIDMpKQ0KaGlzdChoaWdoX3BhcmVudGFsX2ludm9sdmVtZW50LCBtYWluID0gIkhpZ2ggUGFyZW50YWwgSW52b2x2ZW1lbnQiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChtZWRpdW1fcGFyZW50YWxfaW52b2x2ZW1lbnQsIG1haW4gPSAiTWVkaXVtIFBhcmVudGFsIEludm9sdmVtZW50IiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QobG93X3BhcmVudGFsX2ludm9sdmVtZW50LCBtYWluID0gIkxvdyBQYXJlbnRhbCBJbnZvbHZlbWVudCIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCg0KIyBDaGVjayBhc3N1bXB0aW9ucyBvZiBBTk9WQQ0Kc2hhcGlyby50ZXN0KGhpZ2hfcGFyZW50YWxfaW52b2x2ZW1lbnQpDQpzaGFwaXJvLnRlc3QobWVkaXVtX3BhcmVudGFsX2ludm9sdmVtZW50KQ0Kc2hhcGlyby50ZXN0KGxvd19wYXJlbnRhbF9pbnZvbHZlbWVudCkNCmBgYA0KDQpCb3RoIHRoZSBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHBhcmVudGFsIGludm9sdmVtZW50IGxldmVscy4NCmBgYHtyfQ0KIyBBTk9WQSB0ZXN0IGZvciBzdHVkeSBob3VycyBieSBwYXJlbnRhbCBpbnZvbHZlbWVudA0KYW5vdmFfcGFyZW50YWxfaW52b2x2ZW1lbnQgPC0gYW92KEhvdXJzX1N0dWRpZWQgfiBQYXJlbnRhbF9JbnZvbHZlbWVudCwgZGF0YSA9IHN0dWRlbnRfZGF0YSkNCnN1bW1hcnkoYW5vdmFfcGFyZW50YWxfaW52b2x2ZW1lbnQpDQpgYGANCg0KVGhlIEFOT1ZBIHRlc3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBwYXJlbnRhbCBpbnZvbHZlbWVudCBsZXZlbHMsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHBhcmVudGFsIGludm9sdmVtZW50IGRvZXMgbm90IGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlay4NCg0KIyMgQXZlcmFnZSBOdW1iZXIgb2YgSG91cnMgU3R1ZGVudHMgU3R1ZHkgcGVyIFdlZWsgKEFjY2Vzc190b19SZXNvdXJjZXMgQ2F0ZWdvcnkpDQoNCldlIG5vdyBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBhY2Nlc3MgdG8gcmVzb3VyY2VzLg0KDQpgYGB7cn0NCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEFjY2Vzc190b19SZXNvdXJjZXMgPT0gIkhpZ2giXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEFjY2Vzc190b19SZXNvdXJjZXMgPT0gIk1lZGl1bSJdKQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiTG93Il0pDQpgYGANCg0KVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gYWNjZXNzIHRvIHJlc291cmNlcyBkbyBub3Qgc2hvdyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIGFjY2VzcyB0byByZXNvdXJjZXMuIEJ1dCBmaXJzdCwgd2UgbmVlZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbnMgb2YgQU5PVkEuDQoNCmBgYHtyfQ0KIyBTYW1wbGUgdGhlIGRhdGENCmhpZ2hfYWNjZXNzX3RvX3Jlc291cmNlcyA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkQWNjZXNzX3RvX1Jlc291cmNlcyA9PSAiSGlnaCJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJEFjY2Vzc190b19SZXNvdXJjZXMgPT0gIkhpZ2giKSwgMTAwKV0NCm1lZGl1bV9hY2Nlc3NfdG9fcmVzb3VyY2VzIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRBY2Nlc3NfdG9fUmVzb3VyY2VzID09ICJNZWRpdW0iXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRBY2Nlc3NfdG9fUmVzb3VyY2VzID09ICJNZWRpdW0iKSwgMTAwKV0NCmxvd19hY2Nlc3NfdG9fcmVzb3VyY2VzIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRBY2Nlc3NfdG9fUmVzb3VyY2VzID09ICJMb3ciXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRBY2Nlc3NfdG9fUmVzb3VyY2VzID09ICJMb3ciKSwgMTAwKV0NCg0KIyBIaXN0b2dyYW0gb2Ygc3R1ZHkgaG91cnMgYnkgYWNjZXNzIHRvIHJlc291cmNlcw0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QoaGlnaF9hY2Nlc3NfdG9fcmVzb3VyY2VzLCBtYWluID0gIkhpZ2ggQWNjZXNzIHRvIFJlc291cmNlcyIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KG1lZGl1bV9hY2Nlc3NfdG9fcmVzb3VyY2VzLCBtYWluID0gIk1lZGl1bSBBY2Nlc3MgdG8gUmVzb3VyY2VzIiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QobG93X2FjY2Vzc190b19yZXNvdXJjZXMsIG1haW4gPSAiTG93IEFjY2VzcyB0byBSZXNvdXJjZXMiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIENoZWNrIGFzc3VtcHRpb25zIG9mIEFOT1ZBDQpzaGFwaXJvLnRlc3QoaGlnaF9hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0Kc2hhcGlyby50ZXN0KG1lZGl1bV9hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0Kc2hhcGlyby50ZXN0KGxvd19hY2Nlc3NfdG9fcmVzb3VyY2VzKQ0KYGBgDQoNCkJvdGggdGhlIGhpc3RvZ3JhbXMgYW5kIHRoZSBTaGFwaXJvLVdpbGsgdGVzdCBzaG93IHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzdHVkeSBob3VycyBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCBmb3IgYWxsIHN0dWRlbnRzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gYWNjZXNzIHRvIHJlc291cmNlcy4NCmBgYHtyfQ0KIyBBTk9WQSB0ZXN0IGZvciBzdHVkeSBob3VycyBieSBhY2Nlc3MgdG8gcmVzb3VyY2VzDQphbm92YV9hY2Nlc3NfdG9fcmVzb3VyY2VzIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gQWNjZXNzX3RvX1Jlc291cmNlcywgZGF0YSA9IHN0dWRlbnRfZGF0YSkNCnN1bW1hcnkoYW5vdmFfYWNjZXNzX3RvX3Jlc291cmNlcykNCmBgYA0KDQpUaGUgQU5PVkEgdGVzdCBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIGFjY2VzcyB0byByZXNvdXJjZXMsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IGFjY2VzcyB0byByZXNvdXJjZXMgZG9lcyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrLg0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgQ2F0ZWdvcnkpDQoNCk5leHQsIHdlIGV4cGxvcmUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHBhcnRpY2lwYXRpb24gaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMuDQpgYGB7cn0NCiMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBzdHVkeSBob3VycyBieSBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcw0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIlllcyJdKQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIk5vIl0pDQpgYGANCg0KVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gcGFydGljaXBhdGlvbiBpbiBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcyBzaG93IG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gcGFydGljaXBhdGlvbiBpbiBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcy4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KcGFydGljaXBhdGVfZXh0cmFjdXJyaWN1bGFyIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRFeHRyYWN1cnJpY3VsYXJfQWN0aXZpdGllcyA9PSAiWWVzIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIlllcyIpLCAxMDApXQ0KZG9fbm90X3BhcnRpY2lwYXRlX2V4dHJhY3VycmljdWxhciA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIk5vIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkRXh0cmFjdXJyaWN1bGFyX0FjdGl2aXRpZXMgPT0gIk5vIiksIDEwMCldDQoNCiMgSGlzdG9ncmFtIG9mIHN0dWR5IGhvdXJzIGJ5IGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KaGlzdChwYXJ0aWNpcGF0ZV9leHRyYWN1cnJpY3VsYXIsIG1haW4gPSAiRXh0cmFjdXJyaWN1bGFyIEFjdGl2aXRpZXMiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChkb19ub3RfcGFydGljaXBhdGVfZXh0cmFjdXJyaWN1bGFyLCBtYWluID0gIk5vIEV4dHJhY3VycmljdWxhciBBY3Rpdml0aWVzIiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCg0KIyBDaGVjayBhc3N1bXB0aW9ucyBvZiBBTk9WQQ0Kc2hhcGlyby50ZXN0KHBhcnRpY2lwYXRlX2V4dHJhY3VycmljdWxhcikNCnNoYXBpcm8udGVzdChkb19ub3RfcGFydGljaXBhdGVfZXh0cmFjdXJyaWN1bGFyKQ0KYGBgDQoNCkJvdGggdGhlIGhpc3RvZ3JhbXMgYW5kIHRoZSBTaGFwaXJvLVdpbGsgdGVzdCBzaG93IHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzdHVkeSBob3VycyBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCBmb3IgYWxsIHN0dWRlbnRzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gcGFydGljaXBhdGlvbiBpbiBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcy4NCg0KYGBge3J9DQojIEFOT1ZBIHRlc3QgZm9yIHN0dWR5IGhvdXJzIGJ5IGV4dHJhY3VycmljdWxhciBhY3Rpdml0aWVzDQphbm92YV9leHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcyA8LSBhb3YoSG91cnNfU3R1ZGllZCB+IEV4dHJhY3VycmljdWxhcl9BY3Rpdml0aWVzLCBkYXRhID0gc3R1ZGVudF9kYXRhKQ0Kc3VtbWFyeShhbm92YV9leHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykNCmBgYA0KDQpUaGUgQU5PVkEgdGVzdCBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHBhcnRpY2lwYXRpb24gaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHBhcnRpY2lwYXRpb24gaW4gZXh0cmFjdXJyaWN1bGFyIGFjdGl2aXRpZXMgZG9lcyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrLg0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoTW90aXZhdGlvbl9MZXZlbCBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gbW90aXZhdGlvbiBsZXZlbHMuDQpgYGB7cn0NCiMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBzdHVkeSBob3VycyBieSBtb3RpdmF0aW9uIGxldmVsDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRNb3RpdmF0aW9uX0xldmVsID09ICJIaWdoIl0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRNb3RpdmF0aW9uX0xldmVsID09ICJNZWRpdW0iXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIkxvdyJdKQ0KYGBgDQoNClRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIG1vdGl2YXRpb24gbGV2ZWxzIHNob3cgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiBtb3RpdmF0aW9uIGxldmVscy4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KaGlnaF9tb3RpdmF0aW9uIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRNb3RpdmF0aW9uX0xldmVsID09ICJIaWdoIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkTW90aXZhdGlvbl9MZXZlbCA9PSAiSGlnaCIpLCAxMDApXQ0KbWVkaXVtX21vdGl2YXRpb24gPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIk1lZGl1bSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIk1lZGl1bSIpLCAxMDApXQ0KbG93X21vdGl2YXRpb24gPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIkxvdyJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJE1vdGl2YXRpb25fTGV2ZWwgPT0gIkxvdyIpLCAxMDApXQ0KDQojIEhpc3RvZ3JhbSBvZiBzdHVkeSBob3VycyBieSBtb3RpdmF0aW9uIGxldmVsDQpwYXIobWZyb3cgPSBjKDEsIDMpKQ0KaGlzdChoaWdoX21vdGl2YXRpb24sIG1haW4gPSAiSGlnaCBNb3RpdmF0aW9uIExldmVsIiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QobWVkaXVtX21vdGl2YXRpb24sIG1haW4gPSAiTWVkaXVtIE1vdGl2YXRpb24gTGV2ZWwiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChsb3dfbW90aXZhdGlvbiwgbWFpbiA9ICJMb3cgTW90aXZhdGlvbiBMZXZlbCIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQ2hlY2sgYXNzdW1wdGlvbnMgb2YgQU5PVkENCnNoYXBpcm8udGVzdChoaWdoX21vdGl2YXRpb24pDQpzaGFwaXJvLnRlc3QobWVkaXVtX21vdGl2YXRpb24pDQpzaGFwaXJvLnRlc3QobG93X21vdGl2YXRpb24pDQpgYGANCg0KQWxsIHRocmVlIGhpc3RvZ3JhbXMgYW5kIHRoZSBTaGFwaXJvLVdpbGsgdGVzdCBzaG93IHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzdHVkeSBob3VycyBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCBmb3IgYWxsIHN0dWRlbnRzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gbW90aXZhdGlvbiBsZXZlbHMuDQoNCmBgYHtyfQ0KIyBBTk9WQSB0ZXN0IGZvciBzdHVkeSBob3VycyBieSBtb3RpdmF0aW9uIGxldmVsDQphbm92YV9tb3RpdmF0aW9uX2xldmVsIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gTW90aXZhdGlvbl9MZXZlbCwgZGF0YSA9IHN0dWRlbnRfZGF0YSkNCnN1bW1hcnkoYW5vdmFfbW90aXZhdGlvbl9sZXZlbCkNCmBgYA0KDQpUaGUgQU5PVkEgdGVzdCBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIG1vdGl2YXRpb24gbGV2ZWxzLCB3aXRoIGEgcC12YWx1ZSBncmVhdGVyIHRoYW4gMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBtb3RpdmF0aW9uIGxldmVscyBkbyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrLg0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoSW50ZXJuZXQgQWNjZXNzIENhdGVnb3J5KQ0KDQpOZXh0LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBpbnRlcm5ldCBhY2Nlc3MuDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHN0dWR5IGhvdXJzIGJ5IGludGVybmV0IGFjY2Vzcw0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkSW50ZXJuZXRfQWNjZXNzID09ICJZZXMiXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEludGVybmV0X0FjY2VzcyA9PSAiTm8iXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBpbnRlcm5ldCBhY2Nlc3Mgc2hvdyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIGludGVybmV0IGFjY2Vzcy4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KaW50ZXJuZXRfYWNjZXNzIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRJbnRlcm5ldF9BY2Nlc3MgPT0gIlllcyJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJEludGVybmV0X0FjY2VzcyA9PSAiWWVzIiksIDEwMCldDQpub19pbnRlcm5ldF9hY2Nlc3MgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEludGVybmV0X0FjY2VzcyA9PSAiTm8iXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRJbnRlcm5ldF9BY2Nlc3MgPT0gIk5vIiksIDEwMCldDQoNCiMgSGlzdG9ncmFtIG9mIHN0dWR5IGhvdXJzIGJ5IGludGVybmV0IGFjY2Vzcw0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmhpc3QoaW50ZXJuZXRfYWNjZXNzLCBtYWluID0gIkludGVybmV0IEFjY2VzcyIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KG5vX2ludGVybmV0X2FjY2VzcywgbWFpbiA9ICJObyBJbnRlcm5ldCBBY2Nlc3MiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIENoZWNrIGFzc3VtcHRpb25zIG9mIEFOT1ZBDQpzaGFwaXJvLnRlc3QoaW50ZXJuZXRfYWNjZXNzKQ0Kc2hhcGlyby50ZXN0KG5vX2ludGVybmV0X2FjY2VzcykNCmBgYA0KDQpCb3RoIHRoZSBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIGludGVybmV0IGFjY2Vzcy4NCg0KYGBge3J9DQojIEFOT1ZBIHRlc3QgZm9yIHN0dWR5IGhvdXJzIGJ5IGludGVybmV0IGFjY2Vzcw0KYW5vdmFfaW50ZXJuZXRfYWNjZXNzIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gSW50ZXJuZXRfQWNjZXNzLCBkYXRhID0gc3R1ZGVudF9kYXRhKQ0Kc3VtbWFyeShhbm92YV9pbnRlcm5ldF9hY2Nlc3MpDQpgYGANCg0KVGhlIEFOT1ZBIHRlc3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBpbnRlcm5ldCBhY2Nlc3MsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IGludGVybmV0IGFjY2VzcyBkb2VzIG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsuDQoNCiMjIEF2ZXJhZ2UgTnVtYmVyIG9mIEhvdXJzIFN0dWRlbnRzIFN0dWR5IHBlciBXZWVrIChGYW1pbHkgSW5jb21lIENhdGVnb3J5KQ0KDQpOZXh0LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBmYW1pbHkgaW5jb21lIGxldmVscy4NCg0KYGBge3J9DQojIFN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc3R1ZHkgaG91cnMgYnkgZmFtaWx5IGluY29tZQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRmFtaWx5X0luY29tZSA9PSAiTG93Il0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRGYW1pbHlfSW5jb21lID09ICJNZWRpdW0iXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEZhbWlseV9JbmNvbWUgPT0gIkhpZ2giXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBmYW1pbHkgaW5jb21lIGxldmVscyBzaG93IG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gZmFtaWx5IGluY29tZSBsZXZlbHMuIEJ1dCBmaXJzdCwgd2UgbmVlZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbnMgb2YgQU5PVkEuDQoNCmBgYHtyfQ0KIyBTYW1wbGUgdGhlIGRhdGENCmxvd19mYW1pbHlfaW5jb21lIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRGYW1pbHlfSW5jb21lID09ICJMb3ciXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRGYW1pbHlfSW5jb21lID09ICJMb3ciKSwgMTAwKV0NCm1lZGl1bV9mYW1pbHlfaW5jb21lIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRGYW1pbHlfSW5jb21lID09ICJNZWRpdW0iXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRGYW1pbHlfSW5jb21lID09ICJNZWRpdW0iKSwgMTAwKV0NCmhpZ2hfZmFtaWx5X2luY29tZSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRmFtaWx5X0luY29tZSA9PSAiSGlnaCJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJEZhbWlseV9JbmNvbWUgPT0gIkhpZ2giKSwgMTAwKV0NCg0KIyBIaXN0b2dyYW0gb2Ygc3R1ZHkgaG91cnMgYnkgZmFtaWx5IGluY29tZQ0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QobG93X2ZhbWlseV9pbmNvbWUsIG1haW4gPSAiTG93IEZhbWlseSBJbmNvbWUiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChtZWRpdW1fZmFtaWx5X2luY29tZSwgbWFpbiA9ICJNZWRpdW0gRmFtaWx5IEluY29tZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KGhpZ2hfZmFtaWx5X2luY29tZSwgbWFpbiA9ICJIaWdoIEZhbWlseSBJbmNvbWUiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIENoZWNrIGFzc3VtcHRpb25zIG9mIEFOT1ZBDQpzaGFwaXJvLnRlc3QobG93X2ZhbWlseV9pbmNvbWUpDQpzaGFwaXJvLnRlc3QobWVkaXVtX2ZhbWlseV9pbmNvbWUpDQpzaGFwaXJvLnRlc3QoaGlnaF9mYW1pbHlfaW5jb21lKQ0KYGBgDQoNClRoZSBTaGFwaXJvLVdpbGsgdGVzdCBzaG93cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIHN0dWRlbnRzIHdpdGggbWVkaXVtIGFuZCBoaWdoIGZhbWlseSBpbmNvbWUgbGV2ZWxzLCB3aXRoIHAtdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjA1LiBIb3dldmVyLCB0aGUgZGlzdHJpYnV0aW9uIGZvciBzdHVkZW50cyB3aXRoIGxvdyBmYW1pbHkgaW5jb21lIGlzIHNsaWdodGx5IHNrZXdlZCwgd2l0aCBhIHAtdmFsdWUgbGVzcyB0aGFuIDAuMDUgaW5kaWNhdGluZyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgbm90IG5vcm1hbC4gV2Ugd2lsbCBub3cgdXNlIEtydWtzYWwtV2FsbGlzIHRlc3QgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gZmFtaWx5IGluY29tZSBsZXZlbHMuDQoNCmBgYHtyfQ0KIyBLcnVza2FsLVdhbGxpcyB0ZXN0IGZvciBzdHVkeSBob3VycyBieSBmYW1pbHkgaW5jb21lDQprcnVza2FsLnRlc3QoSG91cnNfU3R1ZGllZCB+IEZhbWlseV9JbmNvbWUsIGRhdGEgPSBzdHVkZW50X2RhdGEpDQpgYGANCg0KVGhlIEtydXNrYWwtV2FsbGlzIHRlc3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBmYW1pbHkgaW5jb21lIGxldmVscywgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgZmFtaWx5IGluY29tZSBkb2VzIG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsuDQoNCiMjIEF2ZXJhZ2UgTnVtYmVyIG9mIEhvdXJzIFN0dWRlbnRzIFN0dWR5IHBlciBXZWVrIChUZWFjaGVyIFF1YWxpdHkgQ2F0ZWdvcnkpDQoNCk5leHQsIHdlIGV4cGxvcmUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHRlYWNoZXIgcXVhbGl0eSBsZXZlbHMuDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHN0dWR5IGhvdXJzIGJ5IHRlYWNoZXIgcXVhbGl0eQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkVGVhY2hlcl9RdWFsaXR5ID09ICJMb3ciXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFRlYWNoZXJfUXVhbGl0eSA9PSAiTWVkaXVtIl0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRUZWFjaGVyX1F1YWxpdHkgPT0gIkhpZ2giXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiB0ZWFjaGVyIHF1YWxpdHkgbGV2ZWxzIHNob3cgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiB0ZWFjaGVyIHF1YWxpdHkgbGV2ZWxzLiBCdXQgZmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGFzc3VtcHRpb25zIG9mIEFOT1ZBLg0KDQpgYGB7cn0NCiMgU2FtcGxlIHRoZSBkYXRhDQpsb3dfdGVhY2hlcl9xdWFsaXR5IDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRUZWFjaGVyX1F1YWxpdHkgPT0gIkxvdyJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFRlYWNoZXJfUXVhbGl0eSA9PSAiTG93IiksIDEwMCldDQptZWRpdW1fdGVhY2hlcl9xdWFsaXR5IDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRUZWFjaGVyX1F1YWxpdHkgPT0gIk1lZGl1bSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFRlYWNoZXJfUXVhbGl0eSA9PSAiTWVkaXVtIiksIDEwMCldDQpoaWdoX3RlYWNoZXJfcXVhbGl0eSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkVGVhY2hlcl9RdWFsaXR5ID09ICJIaWdoIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkVGVhY2hlcl9RdWFsaXR5ID09ICJIaWdoIiksIDEwMCldDQoNCiMgSGlzdG9ncmFtIG9mIHN0dWR5IGhvdXJzIGJ5IHRlYWNoZXIgcXVhbGl0eQ0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QobG93X3RlYWNoZXJfcXVhbGl0eSwgbWFpbiA9ICJMb3cgVGVhY2hlciBRdWFsaXR5IiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QobWVkaXVtX3RlYWNoZXJfcXVhbGl0eSwgbWFpbiA9ICJNZWRpdW0gVGVhY2hlciBRdWFsaXR5IiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCmhpc3QoaGlnaF90ZWFjaGVyX3F1YWxpdHksIG1haW4gPSAiSGlnaCBUZWFjaGVyIFF1YWxpdHkiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIENoZWNrIGFzc3VtcHRpb25zIG9mIEFOT1ZBDQpzaGFwaXJvLnRlc3QobG93X3RlYWNoZXJfcXVhbGl0eSkNCnNoYXBpcm8udGVzdChtZWRpdW1fdGVhY2hlcl9xdWFsaXR5KQ0Kc2hhcGlyby50ZXN0KGhpZ2hfdGVhY2hlcl9xdWFsaXR5KQ0KYGBgDQoNCkFsbCB0aHJlZSBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHRlYWNoZXIgcXVhbGl0eSBsZXZlbHMuDQoNCmBgYHtyfQ0KIyBBTk9WQSB0ZXN0IGZvciBzdHVkeSBob3VycyBieSB0ZWFjaGVyIHF1YWxpdHkNCmFub3ZhX3RlYWNoZXJfcXVhbGl0eSA8LSBhb3YoSG91cnNfU3R1ZGllZCB+IFRlYWNoZXJfUXVhbGl0eSwgZGF0YSA9IHN0dWRlbnRfZGF0YSkNCnN1bW1hcnkoYW5vdmFfdGVhY2hlcl9xdWFsaXR5KQ0KYGBgDQoNClRoZSBBTk9WQSB0ZXN0IHNob3dzIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gdGVhY2hlciBxdWFsaXR5IGxldmVscywgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGVhY2hlciBxdWFsaXR5IGRvZXMgbm90IGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlay4NCg0KIyMgQXZlcmFnZSBOdW1iZXIgb2YgSG91cnMgU3R1ZGVudHMgU3R1ZHkgcGVyIFdlZWsgKFNjaG9vbCBUeXBlIENhdGVnb3J5KQ0KDQpOZXh0LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBzY2hvb2wgdHlwZS4NCg0KYGBge3J9DQojIFN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc3R1ZHkgaG91cnMgYnkgc2Nob29sIHR5cGUNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFNjaG9vbF9UeXBlID09ICJQdWJsaWMiXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFNjaG9vbF9UeXBlID09ICJQcml2YXRlIl0pDQpgYGANCg0KVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gc2Nob29sIHR5cGUgc2hvdyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHNjaG9vbCB0eXBlLiBCdXQgZmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGFzc3VtcHRpb25zIG9mIEFOT1ZBLg0KDQpgYGB7cn0NCiMgU2FtcGxlIHRoZSBkYXRhDQpwdWJsaWNfc2Nob29sIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRTY2hvb2xfVHlwZSA9PSAiUHVibGljIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkU2Nob29sX1R5cGUgPT0gIlB1YmxpYyIpLCAxMDApXQ0KcHJpdmF0ZV9zY2hvb2wgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFNjaG9vbF9UeXBlID09ICJQcml2YXRlIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkU2Nob29sX1R5cGUgPT0gIlByaXZhdGUiKSwgMTAwKV0NCg0KIyBIaXN0b2dyYW0gb2Ygc3R1ZHkgaG91cnMgYnkgc2Nob29sIHR5cGUNCnBhcihtZnJvdyA9IGMoMSwgMikpDQpoaXN0KHB1YmxpY19zY2hvb2wsIG1haW4gPSAiUHVibGljIFNjaG9vbCIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KHByaXZhdGVfc2Nob29sLCBtYWluID0gIlByaXZhdGUgU2Nob29sIiwgeGxhYiA9ICJTdHVkeSBIb3VycyIsIGNvbCA9ICJza3libHVlIiwgYm9yZGVyID0gImJsYWNrIikNCg0KIyBDaGVjayBhc3N1bXB0aW9ucyBvZiBBTk9WQQ0Kc2hhcGlyby50ZXN0KHB1YmxpY19zY2hvb2wpDQpzaGFwaXJvLnRlc3QocHJpdmF0ZV9zY2hvb2wpDQpgYGANCg0KQm90aCBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHNjaG9vbCB0eXBlLg0KDQpgYGB7cn0NCiMgQU5PVkEgdGVzdCBmb3Igc3R1ZHkgaG91cnMgYnkgc2Nob29sIHR5cGUNCmFub3ZhX3NjaG9vbF90eXBlIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gU2Nob29sX1R5cGUsIGRhdGEgPSBzdHVkZW50X2RhdGEpDQpzdW1tYXJ5KGFub3ZhX3NjaG9vbF90eXBlKQ0KYGBgDQoNClRoZSBBTk9WQSB0ZXN0IHNob3dzIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gc2Nob29sIHR5cGUsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHNjaG9vbCB0eXBlIGRvZXMgbm90IGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlay4NCg0KIyMgQXZlcmFnZSBOdW1iZXIgb2YgSG91cnMgU3R1ZGVudHMgU3R1ZHkgcGVyIFdlZWsgKFBlZXIgSW5mbHVlbmNlIENhdGVnb3J5KQ0KDQpOZXh0LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBwZWVyIGluZmx1ZW5jZSBsZXZlbHMuDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHN0dWR5IGhvdXJzIGJ5IHBlZXIgaW5mbHVlbmNlDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRQZWVyX0luZmx1ZW5jZSA9PSAiUG9zaXRpdmUiXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBlZXJfSW5mbHVlbmNlID09ICJOZWdhdGl2ZSJdKQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkUGVlcl9JbmZsdWVuY2UgPT0gIk5ldXRyYWwiXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBwZWVyIGluZmx1ZW5jZSBsZXZlbHMgc2hvdyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHBlZXIgaW5mbHVlbmNlIGxldmVscy4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KcG9zaXRpdmVfcGVlcl9pbmZsdWVuY2UgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBlZXJfSW5mbHVlbmNlID09ICJQb3NpdGl2ZSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFBlZXJfSW5mbHVlbmNlID09ICJQb3NpdGl2ZSIpLCAxMDApXQ0KbmVnYXRpdmVfcGVlcl9pbmZsdWVuY2UgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBlZXJfSW5mbHVlbmNlID09ICJOZWdhdGl2ZSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFBlZXJfSW5mbHVlbmNlID09ICJOZWdhdGl2ZSIpLCAxMDApXQ0KbmV1dHJhbF9wZWVyX2luZmx1ZW5jZSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkUGVlcl9JbmZsdWVuY2UgPT0gIk5ldXRyYWwiXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRQZWVyX0luZmx1ZW5jZSA9PSAiTmV1dHJhbCIpLCAxMDApXQ0KDQojIEhpc3RvZ3JhbSBvZiBzdHVkeSBob3VycyBieSBwZWVyIGluZmx1ZW5jZQ0KcGFyKG1mcm93ID0gYygxLCAzKSkNCmhpc3QocG9zaXRpdmVfcGVlcl9pbmZsdWVuY2UsIG1haW4gPSAiUG9zaXRpdmUgUGVlciBJbmZsdWVuY2UiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChuZWdhdGl2ZV9wZWVyX2luZmx1ZW5jZSwgbWFpbiA9ICJOZWdhdGl2ZSBQZWVyIEluZmx1ZW5jZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KG5ldXRyYWxfcGVlcl9pbmZsdWVuY2UsIG1haW4gPSAiTmV1dHJhbCBQZWVyIEluZmx1ZW5jZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQ2hlY2sgYXNzdW1wdGlvbnMgb2YgQU5PVkENCnNoYXBpcm8udGVzdChwb3NpdGl2ZV9wZWVyX2luZmx1ZW5jZSkNCnNoYXBpcm8udGVzdChuZWdhdGl2ZV9wZWVyX2luZmx1ZW5jZSkNCnNoYXBpcm8udGVzdChuZXV0cmFsX3BlZXJfaW5mbHVlbmNlKQ0KYGBgDQoNCkFsbCB0aHJlZSBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIHBlZXIgaW5mbHVlbmNlIGxldmVscy4NCg0KYGBge3J9DQojIEFOT1ZBIHRlc3QgZm9yIHN0dWR5IGhvdXJzIGJ5IHBlZXIgaW5mbHVlbmNlDQphbm92YV9wZWVyX2luZmx1ZW5jZSA8LSBhb3YoSG91cnNfU3R1ZGllZCB+IFBlZXJfSW5mbHVlbmNlLCBkYXRhID0gc3R1ZGVudF9kYXRhKQ0Kc3VtbWFyeShhbm92YV9wZWVyX2luZmx1ZW5jZSkNCmBgYA0KDQpUaGUgQU5PVkEgdGVzdCBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHBlZXIgaW5mbHVlbmNlIGxldmVscywgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgcGVlciBpbmZsdWVuY2UgZG9lcyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrLg0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoTGVhcm5pbmcgRGlzYWJpbGl0eSBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gbGVhcm5pbmcgZGlzYWJpbGl0eS4NCg0KYGBge3J9DQojIFN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc3R1ZHkgaG91cnMgYnkgbGVhcm5pbmcgZGlzYWJpbGl0eQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkTGVhcm5pbmdfRGlzYWJpbGl0aWVzID09ICJZZXMiXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJExlYXJuaW5nX0Rpc2FiaWxpdGllcyA9PSAiTm8iXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBsZWFybmluZyBkaXNhYmlsaXR5IHNob3cgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiBsZWFybmluZyBkaXNhYmlsaXR5LiBCdXQgZmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGFzc3VtcHRpb25zIG9mIEFOT1ZBLg0KDQpgYGB7cn0NCiMgU2FtcGxlIHRoZSBkYXRhDQpsZWFybmluZ19kaXNhYmlsaXRpZXMgPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJExlYXJuaW5nX0Rpc2FiaWxpdGllcyA9PSAiWWVzIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkTGVhcm5pbmdfRGlzYWJpbGl0aWVzID09ICJZZXMiKSwgMTAwKV0NCm5vX2xlYXJuaW5nX2Rpc2FiaWxpdGllcyA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkTGVhcm5pbmdfRGlzYWJpbGl0aWVzID09ICJObyJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJExlYXJuaW5nX0Rpc2FiaWxpdGllcyA9PSAiTm8iKSwgMTAwKV0NCg0KIyBIaXN0b2dyYW0gb2Ygc3R1ZHkgaG91cnMgYnkgbGVhcm5pbmcgZGlzYWJpbGl0eQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmhpc3QobGVhcm5pbmdfZGlzYWJpbGl0aWVzLCBtYWluID0gIkxlYXJuaW5nIERpc2FiaWxpdGllcyIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KG5vX2xlYXJuaW5nX2Rpc2FiaWxpdGllcywgbWFpbiA9ICJObyBMZWFybmluZyBEaXNhYmlsaXRpZXMiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KDQojIENoZWNrIGFzc3VtcHRpb25zIG9mIEFOT1ZBDQpzaGFwaXJvLnRlc3QobGVhcm5pbmdfZGlzYWJpbGl0aWVzKQ0Kc2hhcGlyby50ZXN0KG5vX2xlYXJuaW5nX2Rpc2FiaWxpdGllcykNCmBgYA0KDQpBbGwgaGlzdG9ncmFtcyBhbmQgdGhlIFNoYXBpcm8tV2lsayB0ZXN0IHNob3cgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0dWR5IGhvdXJzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIGZvciBhbGwgc3R1ZGVudHMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiBsZWFybmluZyBkaXNhYmlsaXR5Lg0KDQpgYGB7cn0NCiMgQU5PVkEgdGVzdCBmb3Igc3R1ZHkgaG91cnMgYnkgbGVhcm5pbmcgZGlzYWJpbGl0eQ0KYW5vdmFfbGVhcm5pbmdfZGlzYWJpbGl0aWVzIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gTGVhcm5pbmdfRGlzYWJpbGl0aWVzLCBkYXRhID0gc3R1ZGVudF9kYXRhKQ0Kc3VtbWFyeShhbm92YV9sZWFybmluZ19kaXNhYmlsaXRpZXMpDQpgYGANCg0KVGhlIEFOT1ZBIHRlc3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBsZWFybmluZyBkaXNhYmlsaXR5LCB3aXRoIGEgcC12YWx1ZSBncmVhdGVyIHRoYW4gMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBsZWFybmluZyBkaXNhYmlsaXRpZXMgZG8gbm90IGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlay4NCg0KIyMgQXZlcmFnZSBOdW1iZXIgb2YgSG91cnMgU3R1ZGVudHMgU3R1ZHkgcGVyIFdlZWsgKFBhcmVudGFsIEVkdWNhdGlvbiBMZXZlbCBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVscy4NCg0KYGBge3J9DQojIFN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc3R1ZHkgaG91cnMgYnkgcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVsDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9FZHVjYXRpb25fTGV2ZWwgPT0gIkhpZ2ggU2Nob29sIl0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9FZHVjYXRpb25fTGV2ZWwgPT0gIkNvbGxlZ2UiXSkNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0VkdWNhdGlvbl9MZXZlbCA9PSAiUG9zdGdyYWR1YXRlIl0pDQpgYGANCg0KVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVscyBzaG93IG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLiBXZSB3aWxsIG5vdyB1c2UgQU5PVkEgdG8gdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gc3R1ZHkgaG91cnMgYmFzZWQgb24gcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVscy4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KaGlnaF9zY2hvb2xfZWR1Y2F0aW9uIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRQYXJlbnRhbF9FZHVjYXRpb25fTGV2ZWwgPT0gIkhpZ2ggU2Nob29sIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkUGFyZW50YWxfRWR1Y2F0aW9uX0xldmVsID09ICJIaWdoIFNjaG9vbCIpLCAxMDApXQ0KY29sbGVnZV9lZHVjYXRpb24gPC0gc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJFBhcmVudGFsX0VkdWNhdGlvbl9MZXZlbCA9PSAiQ29sbGVnZSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJFBhcmVudGFsX0VkdWNhdGlvbl9MZXZlbCA9PSAiQ29sbGVnZSIpLCAxMDApXQ0KcG9zdGdyYWR1YXRlX2VkdWNhdGlvbiA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkUGFyZW50YWxfRWR1Y2F0aW9uX0xldmVsID09ICJQb3N0Z3JhZHVhdGUiXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRQYXJlbnRhbF9FZHVjYXRpb25fTGV2ZWwgPT0gIlBvc3RncmFkdWF0ZSIpLCAxMDApXQ0KDQojIEhpc3RvZ3JhbSBvZiBzdHVkeSBob3VycyBieSBwYXJlbnRhbCBlZHVjYXRpb24gbGV2ZWwNCnBhcihtZnJvdyA9IGMoMSwgMykpDQpoaXN0KGhpZ2hfc2Nob29sX2VkdWNhdGlvbiwgbWFpbiA9ICJIaWdoIFNjaG9vbCBFZHVjYXRpb24iLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChjb2xsZWdlX2VkdWNhdGlvbiwgbWFpbiA9ICJDb2xsZWdlIEVkdWNhdGlvbiIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KHBvc3RncmFkdWF0ZV9lZHVjYXRpb24sIG1haW4gPSAiUG9zdGdyYWR1YXRlIEVkdWNhdGlvbiIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQ2hlY2sgYXNzdW1wdGlvbnMgb2YgQU5PVkENCnNoYXBpcm8udGVzdChoaWdoX3NjaG9vbF9lZHVjYXRpb24pDQpzaGFwaXJvLnRlc3QoY29sbGVnZV9lZHVjYXRpb24pDQpzaGFwaXJvLnRlc3QocG9zdGdyYWR1YXRlX2VkdWNhdGlvbikNCmBgYA0KDQpBbGwgdGhyZWUgaGlzdG9ncmFtcyBhbmQgdGhlIFNoYXBpcm8tV2lsayB0ZXN0IHNob3cgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0dWR5IGhvdXJzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIGZvciBhbGwgc3R1ZGVudHMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiBwYXJlbnRhbCBlZHVjYXRpb24gbGV2ZWxzLg0KDQpgYGB7cn0NCiMgQU5PVkEgdGVzdCBmb3Igc3R1ZHkgaG91cnMgYnkgcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVsDQphbm92YV9wYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwgPC0gYW92KEhvdXJzX1N0dWRpZWQgfiBQYXJlbnRhbF9FZHVjYXRpb25fTGV2ZWwsIGRhdGEgPSBzdHVkZW50X2RhdGEpDQpzdW1tYXJ5KGFub3ZhX3BhcmVudGFsX2VkdWNhdGlvbl9sZXZlbCkNCmBgYA0KDQpUaGUgQU5PVkEgdGVzdCBzaG93cyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHBhcmVudGFsIGVkdWNhdGlvbiBsZXZlbHMsIHdpdGggYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHBhcmVudGFsIGVkdWNhdGlvbiBsZXZlbHMgZG8gbm90IGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2Vlay4NCg0KIyMgQXZlcmFnZSBOdW1iZXIgb2YgSG91cnMgU3R1ZGVudHMgU3R1ZHkgcGVyIFdlZWsgKERpc3RhbmNlIGZyb20gSG9tZSBDYXRlZ29yeSkNCg0KTmV4dCwgd2UgZXhwbG9yZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgcGVyIHdlZWsgYmFzZWQgb24gdGhlIGRpc3RhbmNlIGZyb20gaG9tZSB0byBzY2hvb2wuDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHN0dWR5IGhvdXJzIGJ5IGRpc3RhbmNlIGZyb20gaG9tZSAoTmVhciwgTW9kZXJhdGUsIEZhcg0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRGlzdGFuY2VfZnJvbV9Ib21lID09ICJOZWFyIl0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSREaXN0YW5jZV9mcm9tX0hvbWUgPT0gIk1vZGVyYXRlIl0pDQpzdW1tYXJ5KHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSREaXN0YW5jZV9mcm9tX0hvbWUgPT0gIkZhciJdKQ0KYGBgDQoNClRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHRoZSBkaXN0YW5jZSBmcm9tIGhvbWUgdG8gc2Nob29sIHNob3cgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiB0aGUgZGlzdGFuY2UgZnJvbSBob21lIHRvIHNjaG9vbC4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KbmVhcl9kaXN0YW5jZSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRGlzdGFuY2VfZnJvbV9Ib21lID09ICJOZWFyIl1bc2FtcGxlKHN1bShzdHVkZW50X2RhdGEkRGlzdGFuY2VfZnJvbV9Ib21lID09ICJOZWFyIiksIDEwMCldDQptb2RlcmF0ZV9kaXN0YW5jZSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRGlzdGFuY2VfZnJvbV9Ib21lID09ICJNb2RlcmF0ZSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJERpc3RhbmNlX2Zyb21fSG9tZSA9PSAiTW9kZXJhdGUiKSwgMTAwKV0NCmZhcl9kaXN0YW5jZSA8LSBzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkRGlzdGFuY2VfZnJvbV9Ib21lID09ICJGYXIiXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSREaXN0YW5jZV9mcm9tX0hvbWUgPT0gIkZhciIpLCAxMDApXQ0KDQojIEhpc3RvZ3JhbSBvZiBzdHVkeSBob3VycyBieSBkaXN0YW5jZSBmcm9tIGhvbWUNCnBhcihtZnJvdyA9IGMoMSwgMykpDQpoaXN0KG5lYXJfZGlzdGFuY2UsIG1haW4gPSAiTmVhciBEaXN0YW5jZSBmcm9tIEhvbWUiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChtb2RlcmF0ZV9kaXN0YW5jZSwgbWFpbiA9ICJNb2RlcmF0ZSBEaXN0YW5jZSBmcm9tIEhvbWUiLCB4bGFiID0gIlN0dWR5IEhvdXJzIiwgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAiYmxhY2siKQ0KaGlzdChmYXJfZGlzdGFuY2UsIG1haW4gPSAiRmFyIERpc3RhbmNlIGZyb20gSG9tZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQ2hlY2sgYXNzdW1wdGlvbnMgb2YgQU5PVkENCnNoYXBpcm8udGVzdChuZWFyX2Rpc3RhbmNlKQ0Kc2hhcGlyby50ZXN0KG1vZGVyYXRlX2Rpc3RhbmNlKQ0Kc2hhcGlyby50ZXN0KGZhcl9kaXN0YW5jZSkNCmBgYA0KDQpBbGwgdGhyZWUgaGlzdG9ncmFtcyBhbmQgdGhlIFNoYXBpcm8tV2lsayB0ZXN0IHNob3cgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0dWR5IGhvdXJzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIGZvciBhbGwgc3R1ZGVudHMuIFdlIHdpbGwgbm93IHVzZSBBTk9WQSB0byB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBzdHVkeSBob3VycyBiYXNlZCBvbiB0aGUgZGlzdGFuY2UgZnJvbSBob21lIHRvIHNjaG9vbC4NCg0KYGBge3J9DQojIEFOT1ZBIHRlc3QgZm9yIHN0dWR5IGhvdXJzIGJ5IGRpc3RhbmNlIGZyb20gaG9tZQ0KYW5vdmFfZGlzdGFuY2VfZnJvbV9ob21lIDwtIGFvdihIb3Vyc19TdHVkaWVkIH4gRGlzdGFuY2VfZnJvbV9Ib21lLCBkYXRhID0gc3R1ZGVudF9kYXRhKQ0Kc3VtbWFyeShhbm92YV9kaXN0YW5jZV9mcm9tX2hvbWUpDQpgYGANCg0KVGhlIEFOT1ZBIHRlc3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiB0aGUgZGlzdGFuY2UgZnJvbSBob21lIHRvIHNjaG9vbCwgd2l0aCBhIHAtdmFsdWUgZ3JlYXRlciB0aGFuIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRpc3RhbmNlIGZyb20gaG9tZSB0byBzY2hvb2wgZG9lcyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrLg0KDQojIyBBdmVyYWdlIE51bWJlciBvZiBIb3VycyBTdHVkZW50cyBTdHVkeSBwZXIgV2VlayAoR2VuZGVyIENhdGVnb3J5KQ0KDQpGaW5hbGx5LCB3ZSBleHBsb3JlIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBnZW5kZXIuDQoNCmBgYHtyfQ0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MNCnN1bW1hcnkoc3R1ZGVudF9kYXRhJEhvdXJzX1N0dWRpZWRbc3R1ZGVudF9kYXRhJEdlbmRlciA9PSAiTWFsZSJdKQ0Kc3VtbWFyeShzdHVkZW50X2RhdGEkSG91cnNfU3R1ZGllZFtzdHVkZW50X2RhdGEkR2VuZGVyID09ICJGZW1hbGUiXSkNCmBgYA0KDQpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBiYXNlZCBvbiBnZW5kZXIgc2hvdyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIG9uIGdlbmRlci4gQnV0IGZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBBTk9WQS4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0KbWFsZV9kYXRhIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRHZW5kZXIgPT0gIk1hbGUiXVtzYW1wbGUoc3VtKHN0dWRlbnRfZGF0YSRHZW5kZXIgPT0gIk1hbGUiKSwgMTAwKV0NCmZlbWFsZV9kYXRhIDwtIHN0dWRlbnRfZGF0YSRIb3Vyc19TdHVkaWVkW3N0dWRlbnRfZGF0YSRHZW5kZXIgPT0gIkZlbWFsZSJdW3NhbXBsZShzdW0oc3R1ZGVudF9kYXRhJEdlbmRlciA9PSAiRmVtYWxlIiksIDEwMCldDQoNCiMgSGlzdG9ncmFtDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KaGlzdChtYWxlX2RhdGEsIG1haW4gPSAiTWFsZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpoaXN0KGZlbWFsZV9kYXRhLCBtYWluID0gIkZlbWFsZSIsIHhsYWIgPSAiU3R1ZHkgSG91cnMiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQ2hlY2sgYXNzdW1wdGlvbnMgb2YgQU5PVkENCnNoYXBpcm8udGVzdChtYWxlX2RhdGEpDQpzaGFwaXJvLnRlc3QoZmVtYWxlX2RhdGEpDQpgYGANCg0KQm90aCBoaXN0b2dyYW1zIGFuZCB0aGUgU2hhcGlyby1XaWxrIHRlc3Qgc2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2Ygc3R1ZHkgaG91cnMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgZm9yIGFsbCBzdHVkZW50cy4gV2Ugd2lsbCBub3cgdXNlIEFOT1ZBIHRvIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIHN0dWR5IGhvdXJzIGJhc2VkIGdlbmRlci4NCg0KYGBge3J9DQojIEFOT1ZBIHRlc3QNCmFub3ZhX2dlbmRlciA8LSBhb3YoSG91cnNfU3R1ZGllZCB+IEdlbmRlciwgZGF0YSA9IHN0dWRlbnRfZGF0YSkNCnN1bW1hcnkoYW5vdmFfZ2VuZGVyKQ0KYGBgDQoNClRoZSBBTk9WQSB0ZXN0IHNob3dzIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgaG91cnMgc3R1ZGVudHMgc3R1ZHkgYmFzZWQgb24gZ2VuZGVyLg0KDQojIyBTdW1tYXJ5IG9mIEF2ZXJhZ2UgTnVtYmVyIG9mIEhvdXJzIFN0dWRlbnRzIFN0dWR5IHBlciBXZWVrDQoNCkluIHN1bW1hcnksIHRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzdHVkZW50cyBzdHVkeSBwZXIgd2VlayBpcyBhcHByb3hpbWF0ZWx5IDE5Ljk4IGhvdXJzLiBUaGVyZSBhcmUgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGJhc2VkIG9uIHZhcmlvdXMgZmFjdG9ycyBzdWNoIGFzIHBhcmVudGFsIGludm9sdmVtZW50LCBhY2Nlc3MgdG8gcmVzb3VyY2VzLCBleHRyYWN1cnJpY3VsYXIgYWN0aXZpdGllcywgbW90aXZhdGlvbiBsZXZlbHMsIGludGVybmV0IGFjY2VzcywgZmFtaWx5IGluY29tZSwgdGVhY2hlciBxdWFsaXR5LCBzY2hvb2wgdHlwZSwgcGVlciBpbmZsdWVuY2UsIGxlYXJuaW5nIGRpc2FiaWxpdGllcywgcGFyZW50YWwgZWR1Y2F0aW9uIGxldmVscywgZGlzdGFuY2UgZnJvbSBob21lIHRvIHNjaG9vbCwgYW5kIEdlbmRlci4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGhvdXJzIHN0dWRlbnRzIHN0dWR5IHBlciB3ZWVrIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGRpZmZlcmVudCBmYWN0b3JzLg0KDQojIFRoZSB2YXJpYXRpb24gaW4gYXR0ZW5kYW5jZSByYXRlcyBhY3Jvc3Mgc3R1ZGVudHMNCg0KTm93IHdlIGFuYWx5emUgdGhlIHZhcmlhdGlvbiBpbiBhdHRlbmRhbmNlIHJhdGVzIGFjcm9zcyBzdHVkZW50cy4NCg0KYGBge3J9DQojIFNhbXBsZSB0aGUgZGF0YQ0Kc2FtcGxlX2F0dGVuZGFuY2UgPC0gc3R1ZGVudF9kYXRhJEF0dGVuZGFuY2Vbc2FtcGxlKG5yb3coc3R1ZGVudF9kYXRhKSwgMTAwMCldDQoNCiMgU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBhdHRlbmRhbmNlIHJhdGVzDQpzdW1tYXJ5KHNhbXBsZV9hdHRlbmRhbmNlKQ0KDQojIEhpc3RvZ3JhbSBvZiBhdHRlbmRhbmNlIHJhdGVzDQpoaXN0KHNhbXBsZV9hdHRlbmRhbmNlLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBBdHRlbmRhbmNlIFJhdGVzIiwgeGxhYiA9ICJBdHRlbmRhbmNlIFJhdGUiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJibGFjayIpDQpgYGANCg0K